所以,我一直在瞎搞与web服务了一段时间,我不断收到回一些基础知识,我似乎从来没有得到正确的。
问题1:
当使用.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知道什么是包含在后的“数据部”,将被放入变量jsonString? 如何上传从客户端的数据(不C#,让我们说的JQuery代替),因此它被正确地解释在塞雷尔语的一面呢?
(以及如何在WebMessageFormat affet东西呢?我已阅读处处讲这个(MSDN,#2等),但还没有找到一个明确的和很好的答案。)
问题2:
在我试图理解这一点,我想我会做一个非常简单的POST方法,如下所示:
[OperationContract]
[WebInvoke]
string PutJSONRequest(string pc);
然后我尝试打电话使用招这个方法,但是,这并不在所有的工作。 我只是得到一个400错误回来,说:“HTTP / 1.1 400错误的请求”。 我有在方法的代码的第一行断点,方法本身不包含任何内容:
public string PutJSONRequest(string pc)
{
return null;
}
再次,如何.NET知道什么我张贴使用招应包含在“串件”? 它是如何把它解释为一个字符串,什么类型的字符串(UT8,ASCII等)?
这是RAW HTTP请求,从发送的Fiddler:
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
它不事关什么类型的内容类型我使用的,据我所看到的。
响应是一个标准的东西,我在自己的控制不是:
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]
任何帮助,将不胜感激。 谢谢。
我认为,一个简单的代码可以回答你所有的问题
Task.Factory.StartNew(()=>StartServer());
Thread.Yield();
StartClient();
void StartServer()
{
Uri uri = new Uri("http://localhost:8080/test");
WebServiceHost host = new WebServiceHost(typeof(WCFTestServer), uri);
host.Open();
}
void StartClient()
{
try
{
WebClient wc = new WebClient();
//GET
string response1 = wc.DownloadString("http://localhost:8080/test/PutMessageGET/abcdef");
//returns: "fedcba"
//POST with UriTemplate
string response2 = wc.UploadString("http://localhost:8080/test/PutMessagePOSTUriTemplate/abcdef",
JsonConvert.SerializeObject(new { str = "12345" }));
//returns: fedcba NOT 54321
//POST with BodyStyle=WebMessageBodyStyle.WrappedRequest
//Request: {"str":"12345"}
wc.Headers["Content-Type"] = "application/json";
string response3 = wc.UploadString("http://localhost:8080/test/PutMessagePOSTWrappedRequest",
JsonConvert.SerializeObject(new { str="12345" }));
//POST with BodyStyle=WebMessageBodyStyle.Bare
wc.Headers["Content-Type"] = "application/json";
string response4 = wc.UploadString("http://localhost:8080/test/PutMessagePOSTBare", "12345" );
}
catch (WebException wex)
{
Console.WriteLine(wex.Message);
}
}
[ServiceContract]
public class WCFTestServer
{
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/PutMessageGET/{str}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public string PutMessageGET(string str)
{
return String.Join("", str.Reverse());
}
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/PutMessagePOSTUriTemplate/{str}", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public string PutMessagePOSTUriTemplate(string str)
{
return String.Join("", str.Reverse());
}
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle=WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public string PutMessagePOSTWrappedRequest(string str)
{
return String.Join("", str.Reverse());
}
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public string PutMessagePOSTBare(string str)
{
return String.Join("", str.Reverse());
}
}
PS:你可以找到JsonConvert 这里
我找到了答案。 这是如何定义的方法,可以采取在HTTP POST发送的原始数据:
[OperationContract]
[WebInvoke(BodyStyle=WebMessageBodyStyle.Bare)]
Stream PutMessage(Stream data);
和实现是这样的:
public Stream PutMessage(Stream data)
{
byte[] buffer = new byte[65535];
int bytesRead, totalBytes = 0;
do
{
bytesRead = data.Read(buffer, 0, 65535);
totalBytes += bytesRead;
}
while (bytesRead > 0);
// Then you could interpret it as a String for example:
string jsonString = Encoding.UTF8.GetString(buffer, 0, totalBytes);
// yada yada
}
文章来源: Getting a POST endpoint to work in self-hosted (WebServiceHost) C# webservice?