Cyrillic POST header's value
Here is my simple C# code:
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());
}
}
}
So, I trying to send POST request to Apache Server and get server answer. I don't need any additional request heeaders. The problem is then I tried to run this code I got exception:
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:
It seems like I need to convert header value to ISO-8859-1 encoding. So, how can I can get this program working properly? Sorry for my english. I hope for your help. Thanks in advance!
Sample request that works correctly in my situation:
POST / HTTP/1.1 s: АБВ12 username: user password: pass Content-Length: 0 Accept: */* User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5) Host: 127.0.0.1 Connection: Keep-Alive
UPD I've solve this problem by using Interop component WinHttpRequest:
WinHttp.WinHttpRequest o开发者_Python百科HTTP = 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] contains any cyrillic charachters. Thanks everyone!
You can use Uri.EscapeDataString
to escape the non-ASCII character in the request header. The code below (with a simple WCF service to simulate the receiving side) shows how this can be done. Notice that you'll also need to unescape the header value at the server side (shown below as well).
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();
}
}
精彩评论