西里尔文POST标头';s值
本文关键字:标头 POST | 更新日期: 2023-09-27 18:00:12
这是我的简单C#代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
namespace Test
{
class Program
{
static void Main(string[] args)
{
WebRequest req = WebRequest.Create("http://192.168.1.35:8888/");
req.Method = "POST";
req.ContentLength = 0;
req.Headers.Add("s", "АБВ12");
req.Headers.Add("username", "user");
req.Headers.Add("password", "pass");
System.Net.WebResponse resp = req.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
Console.WriteLine(sr.ReadToEnd());
}
}
}
所以,我试图将POST请求发送到Apache服务器并得到服务器的答案。我不需要任何额外的请求。问题是,然后我试图运行这个代码,我得到了异常:
System.ArgumentException was unhandled
Message=Specified value has invalid Control characters.
Parameter name: value
Source=System
ParamName=value
StackTrace:
at System.Net.WebHeaderCollection.CheckBadChars(String name, Boolean isHeaderValue)
at System.Net.WebHeaderCollection.Add(String name, String value)
at Test.Program.Main(String[] args) in D:'Test'Test'Test'Program.cs:line 17
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
似乎我需要将头值转换为ISO-8859-1编码。那么,我怎样才能让这个程序正常工作呢?对不起我的英语。我希望得到你的帮助。提前感谢!
在我的情况下正确工作的示例请求:
POST/HTTP/1.1s: АБВ12用户名:用户密码:pass内容长度:0接受:*/*用户代理:Mozilla/4.0(兼容;Win32;WinHttp.WinHttpRequest.5)主机:127.0.0.1连接:保持活动
UPD我已经通过使用互操作组件WinHttpRequest:解决了这个问题
WinHttp.WinHttpRequest oHTTP = new WinHttp.WinHttpRequest();
oHTTP.Open("POST", "http://127.0.0.1:8888/");
oHTTP.SetRequestHeader("s", args[0]);
oHTTP.SetRequestHeader("username", "user");
oHTTP.SetRequestHeader("password", "pass");
oHTTP.Send();
args[0]包含任何循环字符。谢谢大家!
您可以使用Uri.EscapeDataString
来转义请求标头中的非ASCII字符。下面的代码(使用一个简单的WCF服务来模拟接收端)展示了如何做到这一点。请注意,您还需要在服务器端取消捕获头值(如下所示)。
public class StackOverflow_6449723
{
[ServiceContract]
public class Service
{
[WebGet(UriTemplate = "*", ResponseFormat = WebMessageFormat.Json)]
public Stream GetHeaders()
{
StringBuilder sb = new StringBuilder();
foreach (var header in WebOperationContext.Current.IncomingRequest.Headers.AllKeys)
{
sb.AppendLine(string.Format("{0}: {1}", header, Uri.UnescapeDataString(WebOperationContext.Current.IncomingRequest.Headers[header])));
}
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain; charset=utf-8";
return new MemoryStream(Encoding.UTF8.GetBytes(sb.ToString()));
}
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
host.Open();
Console.WriteLine("Host opened");
WebRequest req = WebRequest.Create(baseAddress + "/foo");
req.Headers.Add("s", Uri.EscapeDataString("АБВ12"));
req.Headers.Add("username", "user");
req.Headers.Add("password", "pass");
WebResponse resp = req.GetResponse();
StreamReader sr = new StreamReader(resp.GetResponseStream());
Console.WriteLine(sr.ReadToEnd());
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}