2011-06-23 16 views
2

は私の簡単なC#のコードです:キリルPOSTヘッダーの値

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()); 
     } 
    } 
} 

だから、私はApacheサーバにPOSTリクエストを送信し、サーバーの応答を取得しようとしています。私は追加の要請者を必要としません。私はISO-8859-1エンコーディングにヘッダ値を変換する必要があるように思え

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: 

:問題は、私は、私は例外だこのコードを実行しようとしています。だから、どうやってこのプログラムを正しく動かすことができますか?私の英語のために申し訳ありません。私はあなたの助けを願っています。 ありがとうございます!


私の状況で正常に動作するサンプル要求:

 
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 私は相互運用コンポーネント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(); 

引数を[0]にはキリル文字が含まれています。みんな、ありがとう!

答えて

4

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(); 
    } 
} 
+0

返信いただきありがとうございます。申し訳ありませんが、私はサーバー側を制御できないと書いていませんでした(私はローカルアドレスを書きました)。問題は、あなたのコードは動作しませんが、それは素敵な試みです。リクエストはサーバーに送信されましたが、 "認識されませんでした"のため、DBの 's'ヘッダー値の値を検索しようとしました。私はVisual FoxProでそのWebサーバーで正常に動作するプログラムを持っています(私の質問更新の適切なリクエストサンプルを参照)。 これは、特定のcrarctersetを使用してサーバーに送信しているようです。 – kseen

関連する問題