Ich gehe hier verrückt. Ich habe in den folgenden Einträgen gesucht und keine von ihnen sind Korrektur des Fehlverhaltens Ich bin Mit:.NET ASMX - Rückgabe von reinem JSON?
- How to return JSON from a 2.0 asmx web service
- How to return JSON from ASP.NET .asmx?
- How to let an ASMX file output JSON
ich auch geschaut haben und bestätigte mein Setup: http://www.asp.net/AJAX/documentation/live/ConfiguringASPNETAJAX.aspx
Hier ist mein Code (ASMX - Code hinten):
namespace RivWorks.Web.Services
{
/// <summary>
/// Summary description for Negotiate
/// </summary>
[WebService(Namespace = "http://rivworks.com/webservices/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[ScriptService]
public class Negotiate : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public RivWorks.Data.Objects.rivProduct GetSetup(string jsonInput)
{
// Deserialize the input and get all the data we need...
// TODO: This is a quick hack just to work with this for now...
char[] tokens = { '(', '{', '}', ')', ',', '"' };
string[] inputs = jsonInput.Split(tokens);
string inputRef = "";
string inputDate = "";
string inputProductID = "";
for (int i = 0; i < inputs.Length; i++)
{
if (inputs[i].Equals("ref", StringComparison.CurrentCultureIgnoreCase))
inputRef = inputs[i+2];
if (inputs[i].Equals("dt", StringComparison.CurrentCultureIgnoreCase))
inputDate = inputs[i+2];
if (inputs[i].Equals("productid", StringComparison.CurrentCultureIgnoreCase))
inputProductID = inputs[i+2];
}
Guid pid = new Guid(inputProductID);
RivWorks.Data.Objects.rivProduct product = RivWorks.Data.rivProducts.GetProductById(pid);
return product;
}
}
Als ich das von meinem localhost Beispiel führe ich dieses Ergebnis Set bin immer:
<ResultSet>
<uiType>modal</uiType>
<width>775</width>
<height>600</height>
<swfSource>
http://localhost.rivworks.com/flash/negotiationPlayer.swf
</swfSource>
<buttonConfig>
http://cdn1.rivworks.com/Element/Misc/734972de-40ae-45f3-9610-5331ddd6e8f8/apple-logo-2.jpg
</buttonConfig>
</ResultSet>
Was bin ich ???
HINWEIS: Ich bin mit dem 3.5 Framework (oder zumindest dachte ich, ich war als alles, was in meinem web.config für 3.5.0.0 markiert ist)
UPDATE: Ich bin gerade zu den Dienst und das Eingabefeld auf dieser Seite verwenden. Sie können hier versuchen: http://dev.rivworks.com/services/Negotiate.asmx?op=GetSetup. Wir versuchen auch, darauf über eine JS-basierte Web-App zuzugreifen, die auf einer anderen Website läuft (der Hauptzweck dieses speziellen Dienstes). Ich habe den Code dafür hier nicht. (Leider hat die Testform ist vom lokalen Host zur Verfügung.)
UPDATE: Ich habe die folgende Testseite (JsonTest.htm), um zu versuchen, um zu sehen, was hin und her ging. Alles was ich bekomme ist ein 500 Fehler! Ich habe sogar versucht, mich an den Prozess zu binden und in meinen Dienst einzutreten. Der 500-Fehler wird ausgelöst, bevor die ASP-Pipeline überhaupt in meinen Code gelangt.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Page</title>
<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function sendReq() {
alert("Before AJAX call");
$.ajax(
{
type: "POST"
, url: "http://kab.rivworks.com/Services/Negotiate.asmx/GetSetup"
, data: "{ \"ref\":\"http://www.rivworks.com/page.htm\", \"dt\":\"Mon Dec 14 2009 10:45:25 GMT-0700 (MST)\", \"productId\":\"5fea7947-251d-4779-85b7-36796edfe7a3\" }"
, contentType: "application/json; charset=utf-8"
, dataType: "json"
, success: GetMessagesBack
, error: Failure
}
);
alert("After AJAX call");
}
function GetMessagesBack(data, textStatus) {
alert(textStatus + "\n" + data);
}
function Failure(XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus + "\n" + errorThrown + "\n" + XMLHttpRequest);
}
</script>
</head>
<body>
<div id="test">Bleh</div>
<a href="javascript:sendReq()">Test it</a>
</body>
</html>
Warum ist das so schmerzhaft schwer?!?! :)
UPDATE: Durch einen WCF-Dienst arbeiten. Hier ist mein Setup: Schnittstelle:
namespace RivWorks.Web.Services
{
[ServiceContract(Name = "Negotiater", Namespace = "http://www.rivworks.com/services")]
public interface INegotiaterJSON
{
//[WebMethod]
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
ResultSet GetSetup(string jsonInput);
}
}
Klasse:
namespace RivWorks.Web.Services
{
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Negotiater : INegotiaterJSON
{
public ResultSet GetSetup(string jsonInput)
{
//code removed for brevity - see ASMX code above if you are really interested.
return resultSet;
}
}
[DataContract()]
public class ResultSet
{
[DataMember]
public string uiType = "modal";
[DataMember]
public int width = 775;
[DataMember]
public int height = 600;
[DataMember]
public string swfSource = "";
[DataMember]
public string buttonConfig = "";
}
}
web.Config
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name ="soapBinding">
<security mode="None" />
</binding>
</basicHttpBinding>
<webHttpBinding>
<binding name="webBinding">
<security mode="None" />
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="poxBehavior">
<webHttp/>
</behavior>
<behavior name="jsonBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="defaultBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="RivWorks.Web.Services.Negotiater" behaviorConfiguration="defaultBehavior">
<endpoint address="json"
binding="webHttpBinding"
bindingConfiguration="webBinding"
behaviorConfiguration="jsonBehavior"
contract="RivWorks.Web.Services.INegotiaterJSON" />
</service>
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://dev.rivworks.com" />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
</system.serviceModel>
einfache Testseite
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Page</title>
<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function sendReq() {
alert("Before AJAX call");
$.ajax(
{
type: "POST"
, url: "http://dev.rivworks.com/Services/Negotiater.svc/GetSetup"
, data: "{ \"ref\":\"http://www.rivworks.com/page.htm\", \"dt\":\"Mon Dec 14 2009 10:45:25 GMT-0700 (MST)\", \"productId\":\"5fea7947-251d-4779-85b7-36796edfe7a3\" }"
, contentType: "application/json; charset=utf-8"
, dataType: "json"
, success: GetMessagesBack
, error: Failure
}
);
alert("After AJAX call");
}
function GetMessagesBack(data, textStatus) {
alert(textStatus + "\n" + data);
}
function Failure(XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus + "\n" + errorThrown + "\n" + XMLHttpRequest);
}
</script>
</head>
<body>
<div id="test">Bleh</div>
<!--<button onclick="javascript:sendReq()">TEST IT</button>-->
<a href="javascript:sendReq()">Test it</a>
</body>
</html>
Und jetzt habe ich diese Störung erhalte: IIS angegebenen Authentifizierungsschemata 'IntegratedWindowsAuthentication, Anonymous', aber die Bindung unterstützt nur Spezifikation von genau einem Authentifizierungsschema. Gültige Authentifizierungsschemas sind Digest, Negotiate, NTLM, Basic oder Anonym. Ändern Sie die IIS-Einstellungen, sodass nur ein einziges Authentifizierungsschema verwendet wird.
Wie gehe ich damit um? < state emotion = 'ausgewrungen' physical = 'schlagen'/>
Können Sie den Code posten, den Sie verwenden, um den Dienst aufzurufen? –
Keith, warum versuchen Sie nicht, Ihre WCF-Anwendung nur zum Testen selbst zu hosten? Es wird IIS aus der Gleichung nehmen. Self-Hosting mit einer Konsolenanwendung ist sehr einfach. (Überprüfen Sie WCFHost.cs in meiner Antwort). –
Das IIS-Problem wurde behoben, indem die integrierte Sicherheit (die wir sowieso nicht verwendeten) gelöscht wurde. Jetzt bekomme ich einen 500 Fehler auf dem SVC. --- Konvertieren von einem selbst gehosteten zu einem Web gehostet ist keine große Sache? Wir haben das letzte Woche in Betrieb genommen. "Sollte nur 10 Minuten dauern". Vielleicht bin ich jetzt zu "in" dem Problem. –