gpt4 book ai didi

c# - 获取 HTTP 错误 400 通过 HttpWebRequest 调用 WCF 服务

转载 作者:行者123 更新时间:2023-11-30 22:40:12 25 4
gpt4 key购买 nike

我有一个可以通过 jQuery 调用的 WCF 服务,但不能通过 HttpWebRequest 调用。之前我已经能够使用完全相同的 HttpWebRequest 设置来调用 ASMX 服务,但这是我第一次尝试调用 WCF 服务。我提供了 jQuery 和 C# HttpWebRequest 代码,希望您能注意到我做的一些明显错误的事情。

这是我损坏的 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>

这是我的服务界面,我尝试将“Method”更改为“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 找到了一篇关于构建 ToJSON() 的文章。使用 JavaScriptSerializer 的扩展方法。使用这种扩展方法,我想出了以下代码/修复。

  1. 创建了一个请求对象(该属性必须与我正在调用的方法的签名匹配)

    class Request
    {
    public string part {get; set;}
    }
  2. 序列化对象以获得正确的 JSON 格式

    Request request = new Request() { part = "ABC" };
    request.ToJSON();

关于c# - 获取 HTTP 错误 400 通过 HttpWebRequest 调用 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com