使用 HttpWebRequest 格式化 POST 数据
我有一个包含两个操作的网络服务。一种操作使用 GET,另一种操作使用 POST。请注意,我不是网络服务专家,所以请随时指出我做错的任何事情。无论如何,我的 WCF 服务中有以下操作:
[WebGet(UriTemplate = "/GetPropertyValue/{propertyID}", ResponseFormat = WebMessageFormat.Json)]
public string GetPropertyValue(string propertyID)
{
return RetrievePropertyValueFromDatabase(propertyID);
}
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string SetPropertyValue(string propertyID, string propertyValue)
{
return SetPropertyValueInDatabase(propertyID, propertyValue);
}
这两个操作由我的 Silverlight Phone 应用程序调用。出于性能原因,此调用必须使用 HttpWebRequest。为了进行此调用,我正在执行以下操作:
// Getting Property Value
string url = GetUrl(propertyID);
// url looks something like http://mydomain.com/myservice.svc/GetPropertyValue/2
WebRequest request = HttpWebRequest.Create(url);
request.BeginGetResponse(new AsyncCallback(GetProperty_Completed), request);
// Elsewhere in my code
// Setting property value
string url = GetUrl(propertyID, propertyValue);
// url looks something like http://mydomain.com/myservice.svc/SetPropertyValue/2/newValue
WebRequest request = HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.BeginGetResponse(new AsyncCallback(SetProperty_Completed), request);
我的网址已正确生成。但是,只有 GetProperty 请求有效。当我在浏览器中复制并粘贴 GetProperty url 时,它可以工作。当我尝试执行 SetProperty 时,我收到一条失败消息,指出未找到端点。我知道浏览器总是使用 GET,所以这是有道理的。但是,从 HttpWebRequest 中,我收到一条错误消息“远程服务器返回错误:NotFound”。我做错了什么?
谢谢你!
I have a web service with two operations. One operation uses GET and the other uses POST. Please note that I am not a web service expert, so please feel free to point out anything I am doing wrong. Regardless, I have the following operations in my WCF service:
[WebGet(UriTemplate = "/GetPropertyValue/{propertyID}", ResponseFormat = WebMessageFormat.Json)]
public string GetPropertyValue(string propertyID)
{
return RetrievePropertyValueFromDatabase(propertyID);
}
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string SetPropertyValue(string propertyID, string propertyValue)
{
return SetPropertyValueInDatabase(propertyID, propertyValue);
}
These two operations are being called by my Silverlight Phone application. This call has to use HttpWebRequest for performance reasons. In an effort to make this call, here is what I'm doing:
// Getting Property Value
string url = GetUrl(propertyID);
// url looks something like http://mydomain.com/myservice.svc/GetPropertyValue/2
WebRequest request = HttpWebRequest.Create(url);
request.BeginGetResponse(new AsyncCallback(GetProperty_Completed), request);
// Elsewhere in my code
// Setting property value
string url = GetUrl(propertyID, propertyValue);
// url looks something like http://mydomain.com/myservice.svc/SetPropertyValue/2/newValue
WebRequest request = HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.BeginGetResponse(new AsyncCallback(SetProperty_Completed), request);
My urls are being generated properly. However, only the GetProperty request works. When I copy and paste the GetProperty url in the browser it works. When I try to execute SetProperty, I receive a failure saying Endpoint not found. I understand that the browser always uses GET, so that would make sense. But, from the HttpWebRequest, I get an error that says "The remote server returned an error: NotFound". What am I doing wrong?
Thank you!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您忘记在 [WebInvoke] 属性中声明 UriTemplate。根据代码片段中的示例 URL,它必须是
"SetPropertyValue/{propertyID}/{propertyValue}"
。这就是为什么它会返回 404。此外,您当然不想使用“application/x-www-form-urlencoded”作为请求内容类型。 WCF 没有相应的 MessageFormatter。另外,您甚至没有为此请求发送任何内容(WCF 将使用 UriTemplateDispatchFormatter)。因此,您还可以远程设置 RequestFormat 和 BodyStyle 属性。仅当您确实希望 Json 返回时才将 ResponseFormat 属性保留在那里!
You forgot to declare the UriTemplate in the [WebInvoke] attribute. According to the sample URL in your code snippet it would have to be
"SetPropertyValue/{propertyID}/{propertyValue}"
. This is why it comes back with a 404.Also, you certainly don't want to use "application/x-www-form-urlencoded" as the request content-type. WCF doesn't have a MessageFormatter for that one. Plus, you're not even sending any content for this request anyways (WCF will use the UriTemplateDispatchFormatter). Hence, you can also remote the RequestFormat and BodyStyle properties. Leave the ResponseFormat property in there only if you really expect Json to come back!
我认为第一个问题是 WCF 不支持 application/x-www-form-urlencoded 内容类型(我不确定这是否是您遇到的唯一问题)。可以使用以下解决方法:
I think that the very first problem is that WCF doesn't support application/x-www-form-urlencoded content type (I'm not sure if it is the only problem you have). Some workarounds can be by using: