Format to POST data with HttpWebRequest
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, st开发者_开发技巧ring 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!
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!
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:
- Raw message processing
- Old unsupported REST Starter kit
- New preview of WCF Web API
- WCFRestContrib
精彩评论