2011-03-19 96 views
2

我有一個WCF服務,我可以通過jQuery調用,但我無法通過HttpWebRequest調用。我已經能夠使用完全相同的HttpWebRequest設置來調用ASMX服務,但這是我第一次嘗試調用WCF服務。我已經提供了jQuery和C#HttpWebRequest代碼,所以你可以很有希望地注意到我所做的顯然是錯誤的。獲取HTTP錯誤400通過HttpWebRequest調用WCF服務

這是我破碎的C#代碼,最後一行拋出錯誤400

string url = "http://www.site.com/Service/Webapi.svc/GetParts"; 
string parameters = "{part: 'ABCDE'}"; 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 

req.Method = "POST"; 
req.ContentLength = 0; 
req.ContentType = "application/json; charset=utf-8"; 

if (!string.IsNullOrEmpty(parameters)) 
{ 
    byte[] byteArray = Encoding.UTF8.GetBytes(parameters); 
    req.ContentLength = byteArray.Length; 
    Stream dataStream = req.GetRequestStream(); 
    dataStream.Write(byteArray, 0, byteArray.Length); 
    dataStream.Close(); 
} 

HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 

這是我工作的jQuery代碼

$.ajax({ 
    url: '/Service/Webapi.svc/GetParts', 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    type: 'POST', 
    data: JSON.stringify({ part: request.term }), 
    success: function (data) { 
     // Success 
    } 
}); 

這裏是我的親戚web.config設置

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="REST"> 
      <enableWebScript/> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    <services> 
     <service name="Webapi"> 
     <endpoint address="" behaviorConfiguration="REST" binding="webHttpBinding" contract="IWebapi"/> 
     </service> 
    </services> 
    </system.serviceModel> 

這裏是我的服務界面,我試着改變「方法」到「POST」,但這並沒有使廣告。差分。

[ServiceContract] 
public interface IWebapi 
{ 
    [OperationContract] 
    [WebInvoke(
     Method = "*", 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.WrappedRequest) 
    ] 
    string[] GetParts(string part); 
} 

這裏是我的服務實現

public string[] GetParts(string part) 
{ 
    return new string[] {"ABC", "BCD", "CDE"}; 
} 

回答

3

好吧,這是遠從早期很明顯,但我發現這個問題....

的HTTP 400錯誤消息的根本原因無效的格式化JSON請求。如果內容類型錯誤(它不是),我發現一篇文章在線討論接收錯誤400,所以我決定再次查看HttpWebRequest中的所有元素。我發現當通過jQuery發送JSON請求時,它具有以下格式。

// Good JSON Formatting 
    {"property":"value"} 

但在我上面的代碼我用

// Bad JSON Formatting 
    {property:"value"} 

進行此更改後,一切正常。爲了防止這種情況再次發生,我從ScottGu發現了一篇關於使用JavaScriptSerializer構建ToJSON()擴展方法的文章。使用這種擴展方法,我想出了以下代碼/修復。

  1. 創建一個請求對象序列化的對象

    class Request 
    { 
        public string part {get; set;} 
    } 
    
  2. 以獲得正確的JSON格式(該屬性必須在方法我打電話的簽名一致)

    Request request = new Request() { part = "ABC" }; 
    request.ToJSON(); 
    
相關問題