【发布时间】:2012-10-15 15:53:31
【问题描述】:
所以,我一直在搞乱网络服务有一段时间了,而且我一直在回归一些基础知识,但我似乎永远不会正确。
问题一:
在 .NET/C# 中使用 WebServiceHost 时,您可以将方法/端点定义为使用 GET/POST/等。设置一个 GET 方法很简单,它几乎可以直接工作,而且很容易理解它是如何工作的。例如:
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/PutMessage/{jsonString}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string PutMessage(string jsonString);
如果我调用 http:///MyWebService/PutMessage/{MyJsonString} 我会通过该方法,一切都很好(或多或少)。
但是,当我将其定义为 POST 时,这意味着什么?
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/PutMessage/{jsonString}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string PutMessage(string jsonString);
UriTemplate 在这里做什么? 如果我执行 POST,我希望数据不会包含在 URI 中,而是包含在帖子的“数据部分”中。但是我是否在数据部分定义变量名? WebServiceHost/.NET如何知道post的“数据部分”中包含的内容是要放入变量jsonString中的?如何从客户端(不是 C#,让我们说 JQuery)发布数据,以便在服务器端正确解释?
(WebMessageFormat 是如何影响事物的?我到处都阅读过这方面的内容(MSDN、Stackoverflow 等),但还没有找到明确而好的答案。)
问题 2:
在尝试理解这一点时,我想我会做一个非常简单的 POST 方法,如下所示:
[OperationContract]
[WebInvoke]
string PutJSONRequest(string pc);
然后我尝试使用 Fiddler 调用此方法,但这根本不起作用。我只是收到一个 400 错误,说“HTTP/1.1 400 Bad Request”。我在方法代码的第一行有一个断点,而方法本身不包含任何内容:
public string PutJSONRequest(string pc)
{
return null;
}
同样,.NET 怎么知道我使用 Fiddler 发布的内容应该包含在“字符串 pc”中? 它如何将其解释为字符串,以及什么类型的字符串(UT8、 ASCII 等)?
这是从 Fiddler 发送的 RAW HTTP 请求:
POST http://<myip>:8093/AlfaCustomerApp/PutJSONRequest HTTP/1.1
User-Agent: Fiddler
Host: <myip>:8093
Content-Length: 3
Content-type: application/x-www-form-urlencoded; charset=UTF-8
asd
据我所知,我使用什么类型的 Content-type 并不重要。
反应是标准的,我无法控制自己:
HTTP/1.1 400 Bad Request
Content-Length: 1165
Content-Type: text/html
Server: Microsoft-HTTPAPI/2.0
Date: Mon, 15 Oct 2012 15:45:02 GMT
[then HTML code]
任何帮助将不胜感激。谢谢。
【问题讨论】:
标签: c# wcf web-services http-post webservicehost