C#HttpWebRequest内容类型未更改
本文关键字:类型 C#HttpWebRequest | 更新日期: 2023-09-27 18:08:09
在C#中,我需要使用HTTP将一些数据POST到web服务器。我不断收到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"。
首先谢谢。
虽然听起来很奇怪,但这对我来说很有效:
((WebRequest)httpWebRequest).ContentType = "application/json";
这改变了更新继承的内部CCD_ 1。
我不确定为什么这样做,但我想这与ContentType
是WebRequest
中的抽象属性有关,并且HttpWebRequest
中的重写属性存在一些错误或问题
一个潜在的问题是,您根据字符串的长度设置内容长度,但这不一定是要发送的正确长度。也就是说,你本质上有:
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
属性设置不正确。我不能说我从未见过这种情况。