Windows Phone 8自定义标头的Http请求

3
我想从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看到:我的电脑没有收到任何东西(使用WebClient时,相同的URL和所有内容都正常工作..除了自定义标头)。在调试中,我可以看到GetRequestStreamCallback被触发并运行。但它永远不会到达GetResponseCallback。大多数相关信息都涉及像GetResponse()这样的方法,似乎不可用于。
在这里应该怎么做?是否可能使HttpWebRequest工作,或者是否有一些解决方案可以在WebClient中设置自定义标头,甚至还有其他更好的方法吗?

编辑: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...但这是不允许的并会抛出异常)


你能提供一下正常工作的 WebClient 代码吗? - nkchandra
你尝试过这个吗?wc.Headers["some header"] = "header value"; - nkchandra
可能是在HttpWebRequest中添加自定义标头的重复问题。 - Anders Marzi Tornblad
1个回答

4

在哪里设置标题头?以下是实现方法:

request.Headers["mycustomheader"] = "abc";

1
我知道。httpWebRequest 代码的问题在于根本没有请求到达服务器。 - Flo
@Flo - 那你更新一下你的问题,反映出你正在尝试做什么? - Security Hound
我以为我已经说得很清楚了。我想发送一个带有自定义头的请求。我尝试使用WebClient发送请求,它可以工作。但是我找不到设置自定义头的方法。我尝试使用HttpWebRequest发送请求,因为我发现在那里设置自定义头是可能的。但是我根本无法让它工作。我的服务器上什么也没有收到。当我能够让它工作时,设置头的命令确实不是问题。该怎么办? - Flo
一定是 IntelliSense 出了问题,我尝试了多次,VisualStudio 显示错误...但过了一段时间它就可以工作了...我不明白,但很高兴现在它可以工作了。 - Flo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接