2011-03-19 67 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(); 
    
相关问题