Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HttpWebRequest发布数据的格式_C#_Silverlight_Wcf_Post_Httpwebrequest - Fatal编程技术网

C# 使用HttpWebRequest发布数据的格式

C# 使用HttpWebRequest发布数据的格式,c#,silverlight,wcf,post,httpwebrequest,C#,Silverlight,Wcf,Post,Httpwebrequest,我有一个具有两个操作的web服务。一个操作使用GET,另一个使用POST。请注意,我不是web服务专家,所以请随时指出我做错了什么。无论如何,我的WCF服务中有以下操作: [WebGet(UriTemplate = "/GetPropertyValue/{propertyID}", ResponseFormat = WebMessageFormat.Json)] public string GetPropertyValue(string propertyID) { return Retrie

我有一个具有两个操作的web服务。一个操作使用GET,另一个使用POST。请注意,我不是web服务专家,所以请随时指出我做错了什么。无论如何,我的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电话应用程序正在调用这两个操作。出于性能原因,此调用必须使用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);
我的URL正在正确生成。但是,只有GetProperty请求有效。当我在浏览器中复制并粘贴GetProperty url时,它会工作。当我尝试执行SetProperty时,我收到一个失败消息,说找不到端点。我知道浏览器总是使用GET,所以这是有意义的。但是,从HttpWebRequest中,我得到一个错误,上面写着“远程服务器返回了一个错误:NotFound”。我做错了什么


谢谢大家!

我认为第一个问题是WCF不支持application/x-www-form-urlencoded内容类型(我不确定这是否是唯一的问题)。一些变通方法可以通过使用:

  • 旧的无支撑的
  • 新预览

    • 我认为第一个问题是WCF不支持application/x-www-form-urlencoded内容类型(我不确定这是否是唯一的问题)。一些变通方法可以通过使用:

      • 旧的无支撑的
      • 新预览

      您忘记在[WebInvoke]属性中声明UriTemplate。根据代码片段中的示例URL,它必须是
      “SetPropertyValue/{propertyID}/{propertyValue}”
      。这就是它带着404回来的原因


      另外,您当然不希望使用“application/x-www-form-urlencoded”作为请求内容类型。WCF没有用于该设置的MessageFormatter。另外,您甚至不会以任何方式发送此请求的任何内容(WCF将使用UriTemplateDispatchFormatter)。因此,您还可以远程访问RequestFormat和BodyStyle属性。只有当您真的希望Json返回时,才将ResponseFormat属性保留在那里

      您忘记在[WebInvoke]属性中声明UriTemplate。根据代码片段中的示例URL,它必须是
      “SetPropertyValue/{propertyID}/{propertyValue}”
      。这就是它带着404回来的原因


      另外,您当然不希望使用“application/x-www-form-urlencoded”作为请求内容类型。WCF没有用于该设置的MessageFormatter。另外,您甚至不会以任何方式发送此请求的任何内容(WCF将使用UriTemplateDispatchFormatter)。因此,您还可以远程访问RequestFormat和BodyStyle属性。只有当您真的希望Json返回时,才将ResponseFormat属性保留在那里

      天哪!非常感谢您的详细回复。我通常会看到一般的反应。我由衷地感谢你的认真。我只希望我能投上几票:)天哪!非常感谢您的详细回复。我通常会看到一般的反应。我由衷地感谢你的认真。我只希望我能投票支持几次:)