【问题标题】:WebRequest will not pass headersWebRequest 不会传递标头
【发布时间】:2014-11-18 23:02:08
【问题描述】:

我已经拖钓并尝试了所有方法,我之前已经完成了 100 次没有问题,但现在我被难住了。

我只是想从网络请求中传递标头信息。

客户端单独运行并连接到 wcf 休息服务。该服务有这个被命中的代码:

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Authorization, Origin, Content-Type, Accept, X-Requested-With");

客户有这个:

    var client = WebRequest.Create(url);
    client.Method = type.ToString().ToUpper();
    client.ContentType = "application/json";
    client.ContentLength = bytes.Length;
    client.Headers.Add(String.Format("Authorization: {0}", "test12345"));

我也试过例如:

    client.Headers["X-Requested-With"] = "test1234";
    client.Headers["Authorization"] = "test1234";

无论我如何尝试设置标题,它们都不会通过。当我在提琴手中查看请求时,授权永远不存在。我也尝试过发送 X-Requested-With 等...但无论什么标头都不会通过。

提前致谢。

更新: 我发现了问题,但没有找到解决方案: WebRequest will not pass headers when used from within ASP.NET MVC controller

【问题讨论】:

  • 根据标准,该 Authorization 标头看起来无效,可能正在被剥离。如果您想使用自定义授权标头,可能使用不同的标头名称?作为测试,如果您将标题名称更改为不同的名称会发生​​什么?
  • 我以前使用过这种格式并且效果很好,但是对于有趣的我尝试了其他方法,我已经更新了我的帖子以反映。感谢您的回复:-)
  • 当你以更传统的方式设置它时会发生什么,例如client .Credentials = new NetworkCredential("user", "pass");(nb 这将产生与上面不同的输出)
  • 在执行 .Credentials 时不会将任何内容添加到标题中。可悲的是我以前做过很多次。我只是不明白为什么无论如何我都不能传递标题信息;-(
  • 我得承认,发生了一些奇怪的事情。当我第一次复制您的代码并在 google.com 上尝试时,未发送授权标头。然后我在需要 Auth 的服务器上尝试了它并发送了它。然后我再次回到 google.com,现在它已发送!很奇怪

标签: c# webrequest


【解决方案1】:

服务器是否需要身份验证?根据this 的回答,WebRequest 在受到挑战之前不会发送凭据。如果您想发送它,无论您可能需要使用与WebRequest 不同的类来发送请求,例如 RestSharp

【讨论】:

  • Yes auth 是必需的,但我尝试发送其他标头,而不仅仅是“授权”。我也控制服务,所以我什至尝试了一些疯狂的事情,比如允许“Test12”.. 在客户端添加它仍然不发送。
  • @schmoopy 你能在你的客户端代码中做一个Console.WriteLine("foo1") 以确保它编译和发送你的更改吗?
  • 是的,我做了一个 Debug.WriteLine... 从控制台你好!!!好建议。我刚刚清理了所有的“临时”。 asp.net 文件也是以防万一,但仍然无法正常工作
【解决方案2】:

您可以使用 RestSharp,而不是使用 WebRequest。它有一个简单的抽象和 API。

【讨论】:

    【解决方案3】:

    我知道这可能为时已晚(在寻找我的问题的一些答案时发现了这个)。

    不知道它是否对你有帮助,但我的就是这样,我在服务器端有 Authorization 标头,我使用的是 4.5.1。

    客户端

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    req.Headers[HttpRequestHeader.Authorization] = "basic " +
                Convert.ToBase64String(
                Encoding.ASCII.GetBytes(
                string.Format("{0}|{1}", "login", "password")));
    
    string result = string.Empty;
    using (WebResponse resp = (HttpWebResponse)req.GetResponse())
    {
        using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
        {
            result = sr.ReadToEnd();
        }
    }
    

    服务器端

    WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.Authorization]
    

    【讨论】:

      【解决方案4】:

      使用 DefaultRequestHeaders

      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("test12345")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-03
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2016-12-17
        • 2019-10-19
        • 2016-08-25
        • 1970-01-01
        相关资源
        最近更新 更多