获取HTTP错误400通过HttpWebRequest调用WCF服务
问题描述:
我有一个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"};
}
答
好吧,这是远从早期很明显,但我发现这个问题....
的HTTP 400错误消息的根本原因无效的格式化JSON请求。如果内容类型错误(它不是),我发现一篇文章在线讨论接收错误400,所以我决定再次查看HttpWebRequest中的所有元素。我发现当通过jQuery发送JSON请求时,它具有以下格式。
// Good JSON Formatting
{"property":"value"}
但在我上面的代码我用
// Bad JSON Formatting
{property:"value"}
进行此更改后,一切正常。为了防止这种情况再次发生,我从ScottGu发现了一篇关于使用JavaScriptSerializer构建ToJSON()扩展方法的文章。使用这种扩展方法,我想出了以下代码/修复。
-
创建一个请求对象序列化的对象
class Request { public string part {get; set;} }
-
以获得正确的JSON格式(该属性必须在方法我打电话的签名一致)
Request request = new Request() { part = "ABC" }; request.ToJSON();