2013-06-21 45 views
0

我想爲我的asp.net Webservice做一個簡單的$ .ajax POST,返回Json。我嘗試了所有可能的解決方案,沒有任何運氣。我錯過了什麼嗎?Webservice忽略ResponseFormat.Json

我的jQuery代碼:

$.ajax({ 
    type: "POST", 
    url: "/Services/ConfiguratorService.asmx/GetInitialJson", 
    contentType: "application/json; charset=utf-8", 
    data: "{}", 
    dataType: "json", 
    success: function (data, textStatus, jqXhr) { 
     if (data != null) { 
      alert(data.d); 
     } else { 
      alert("data undefined: | " + jqXhr + " | " + textStatus); 
     } 
    }, 
    error: function (jqXhr, textStatus, errorThrown) { 
     alert(jqXhr + " | " + textStatus + " | " + errorThrown); 
    } 
}); 

我asmx.cs代碼:

[WebMethod(Description = "Gets initial configuration values for Configurator")] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)] 
public ConfiguratorModel GetInitialModel() 
{ 
    return new Item { Title: "10 units", Text: "Item text..." }; 
} 
public class Item { public string Title {get; set;} public string Text {get; set;} } 

更新1: 在我的解決方案,我得到一個迴應,但僅作爲XML。我試圖在全新的解決方案中重現錯誤,但沒有運氣。一切正常。舊的和新的解決方案中的.asmx服務實際上會返回相同的響應。唯一的區別是,在jQuery的其中一個失敗,錯誤:parsererror,意外的標記<

更新2: 響應頭在我的舊的解決辦法是始終爲「text/xml的;字符集= UTF-8」。

更新3: 我的web.config中包含所有需要的條目。響應仍然是「text/xml; charset = utf-8」。爲什麼?

+0

你想說什麼?錯誤?或什麼?請指定 –

+0

我得到的模型,就像text/xml,而不是jquery中指定的application/json。 – Goran

回答

1

我的一位同事幫助我,指出方向。我發現處理程序是asp.net 2.0。今年早些時候解決方案從2.0升級到4.0。我所要做的就是更換:

<add name="WebServiceHandlerFactory-Integrated" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Services.Protocols.WebServiceHadlerFactory, System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode" responseBufferLimit="4194304" /> 

有:

<add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" /> 

好主意是嘗試刪除所有的處理程序暫時只增加:

<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
0

使用static關鍵字來調用方法,你已經做定義靜態方法

public static ConfiguratorModel GetInitialModel() 
{ 
    return new Item { Title: "10 units", Text: "Item text..." }; 
} 
+0

服務正在返回模型。把它變成靜態將無濟於事。 – Goran

0

我有這樣的Web服務:

[WebService(Namespace = "http://example.com/")] 
[System.Web.Script.Services.ScriptService] 
public class api : System.Web.Services.WebService { 
    [WebMethod(EnableSession = true)] 
    public ServiceResponse<string> SignIn(string _email, string _password) {...} 
} 

和$就調用像你。一切正常,對我來說很好。 可能您需要將[System.Web.Script.Services.ScriptService]添加到您的服務類。據我所知,這是JSON響應的關鍵。 jQuery的調用是這樣的:

$.ajax({ 
     type: "POST", 
     url: "/api.asmx/SignIn", 
     dataType: "json", 
     data: JSON.stringify({"_password": pwd, 
          "_email": email 
         }), 
     contentType: 'application/json; charset=utf-8', 
     success: function (res) { } 
    }); 

編輯:

public ConfiguratorModel GetInitialModel() 
{ 
    return new Item { Title: "10 units", Text: "Item text..." }; 
} 

這種方法定義看起來是錯誤的。我不明白當返回類型爲ConfiguratorModel時,您可能會返回Item。這在編譯時必須失敗。

+0

我沒有提到它,但我已經有了它... – Goran

+0

什麼是響應?它是否包含它應該包含的內容,而只是以XML格式? –

+0

正確,模型返回就好了,只能作爲text/xml。我測試了我的代碼和網頁。在新解決方案中配置配置。返回是json。似乎在我的其他解決方案中的一些舊配置正在搞亂我的迴應,我只是不知道哪一個。 :/ – Goran