我想从 Windows Phone 8 向 WCF 服务器发送一个 HTTP PUT 请求,并且为了识别我必须发送一个自定义标头。(假设“mycustomheader”=“abc”)
WebClient
到目前为止我一直在使用,但Webclient.Headers
似乎没有方法,所以除了枚举Add
中的头之外,不可能发送头。HttpRequestHeader
有什么办法可以做到这一点WebClient
吗?
我看到可以使用HttpWebRequest
类设置自定义标题,但我根本无法让它做任何事情。我的测试代码(基本上是从http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx复制的示例):
public void dosth()
{
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create("http://mycomputer/message");
wr.Method = "PUT";
wr.ContentType = "application/x-www-form-urlencoded";
wr.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), wr);
allDone.WaitOne();
}
private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
Stream postStream = request.EndGetRequestStream(asynchronousResult);
string postData = "{'Command': { 'RequestType' : 'Status', 'Test' : '1' }}";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
postStream.Write(byteArray, 0, postData.Length);
postStream.Close();
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}
private static void GetResponseCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = streamRead.ReadToEnd();
streamResponse.Close();
streamRead.Close();
response.Close();
allDone.Set();
}
正如我在wireshark中看到的那样:我的电脑上没有任何东西(相同的url,一切都可以正常工作WebClient
。除了自定义标题)。在调试中,我可以看到GetRequestStreamCallback
被触发并运行。但它永远不会到达GetResponseCallback
. 我发现的大多数关于此的东西都是指类似的方法GetResponse()
似乎不可用
去这里的路是什么?是否有可能使其HttpWebRequest
工作,或者是否有一些解决方法来设置自定义标头,WebClient
或者是否有另一种更好的方法?
编辑:网络客户端代码:
WebClient wc = new WebClient();
wc.Headers[HttpRequestHeader.ContentLength] = data.Length.ToString();
wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
wc.UploadStringAsync(new Uri("http://mycomputer/message"), "PUT", data);
将正确的数据发送到正确的 url。但是设置自定义标题似乎是不可能的。(甚至在标头中尝试了 \r\n ...但这是不允许的并引发异常)