西里尔文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]包含任何循环字符。谢谢大家!

西里尔文POST标头';s值

您可以使用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();
    }
}