C#HttpWebRequest Content-type not Changing

时间:2014-06-10 10:31:54

标签: c# .net json post httpwebrequest

在C#中,我需要使用HTTP将一些数据发布到Web服务器。我不断收到网络服务器返回的错误,在嗅探数据之后,我发现问题是,内容类型标题仍然设置为“text / html”,并且没有变为“application / json; Charset = UTF-8“在我的程序中。我已经尝试了所有我能想到的可以阻止它改变的东西,但是我没有想法。

以下是导致问题的功能:

private string post(string uri, Dictionary<string, dynamic> parameters)
    {
        //Put parameters into long JSON string
        string data = "{";
        foreach (KeyValuePair<string, dynamic> item in parameters)
        {
            if (item.Value.GetType() == typeof(string))
            {
                data += "\r\n" + item.Key + ": " + "\"" + item.Value + "\"" + ",";
            }
            else if (item.Value.GetType() == typeof(int))
            {
                data += "\r\n" + item.Key + ": " + item.Value + ",";
            }
        }
        data = data.TrimEnd(',');
        data += "\r\n}";

        //Setup web request
        HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(Url + uri);
        wr.KeepAlive = true;
        wr.ContentType = "application/json; charset=UTF-8";
        wr.Method = "POST";
        wr.ContentLength = data.Length;
        //Ignore false certificates for testing/sniffing
        wr.ServerCertificateValidationCallback = delegate { return true; };
        try
        {
            using (Stream dataStream = wr.GetRequestStream())
            {
                //Send request to server
                dataStream.Write(Encoding.UTF8.GetBytes(data), 0, data.Length);
            }
            //Get response from server
            WebResponse response = wr.GetResponse();
            response.Close();
        }
        catch (WebException e)
        {
            MessageBox.Show(e.Message);
        }
        return "";
    }

我遇到问题的原因是因为无论我将其设置为什么内容类型都保持为“text / html”。

感谢advence。

2 个答案:

答案 0 :(得分:2)

虽然听起来很奇怪,但这对我有用:

((WebRequest)httpWebRequest).ContentType =  "application/json";

这会更改更新继承的内部ContentType

我不确定为什么会有效,但我猜它与ContentTypeWebRequest的抽象属性有关,并且HttpWebRequest中的被覆盖的属性存在一些错误或问题1}}

答案 1 :(得分:1)

一个潜在的问题是,您要根据字符串的长度设置内容长度,但这不一定是要发送的正确长度。也就是说,你本质上是:

string data = "whatever goes here."
request.ContentLength = data.Length;
using (var s = request.GetRequestStream())
{
    byte[] byteData = Encoding.UTF8.GetBytes(data);
    s.Write(byteData, 0, data.Length);
}

如果将字符串编码为UTF-8会导致超过data.Length个字节,则会导致问题。如果你有非ASCII字符(即重音字符,非英语语言符号等),就会发生这种情况。所以会发生什么是你的整个字符串都没有发送。

你需要写:

string data = "whatever goes here."
byte[] byteData = Encoding.UTF8.GetBytes(data);
request.ContentLength = byteData.Length;  // this is the number of bytes you want to send
using (var s = request.GetRequestStream())
{
    s.Write(byteData, 0, byteData.Length);
}

那就是说,我不明白为什么你的ContentType属性设置不正确。我不能说我见过这种事。