【问题标题】:WebRequest will not pass headers when used from within ASP.NET MVC controller在 ASP.NET MVC 控制器中使用时,WebRequest 不会传递标头
【发布时间】:2014-11-19 17:02:52
【问题描述】:

我有一个 ASP.NET MVC 4 项目,当我使用 webrequest 进行 http 调用时,标头不会通过。

Linqpad 中的相同代码我可以在标题中设置信息,例如 AUTHORIZATION,它工作正常(我可以在 Fiddler 中看到标题值)

但是,当我在 MCV 控制器中执行相同的代码时,标头不会通过。好像 ASP.NET MVC 正在覆盖我的标头。

有什么建议吗?

        var client = WebRequest.Create(url);
        client.Headers.Add(String.Format("Authorization:{0}", "Fun-Kitty"));
        client.Headers.Add(String.Format("X-Requested-With:{0}", "PowerFlower"));
        client.Method = "GET";
        client.ContentType = "application/json";

        HttpWebResponse resp;
        using (resp = (HttpWebResponse)client.GetResponse())
        {
            if (resp.GetResponseStream() != null)
            {
                var status = resp.StatusDescription; // TODO
                var reader = new StreamReader(resp.GetResponseStream());
                var obj = reader.ReadToEnd();
            }
        }

更新: 请注意,标头设置正确(使用 MVC 控制器调用时除外) - 以各种方式设置标头没有影响(即:在 Linqpad 中工作,而不是在 MVC 控制器中)

    client.Headers.Set("Authorization", "PwrUp");
    client.Headers["Authorization"] = "ababab11ab";
    client.Headers.Add(String.Format("Authorization:{0}", "Fun-Kitty"));

此代码可以很好地从 LinqPad 或 Winforms/WPF 应用程序传递标头,但不能从 ASP.NET MVC 控制器传递。

我还注意到,在检查标头时,当从 MVC 控制器进行调用时,会设置以下值(但不确定它是否与它有任何关系):

X-Requested-With: XMLHttpRequest

【问题讨论】:

    标签: c# asp.net-mvc webrequest


    【解决方案1】:

    我认为您需要删除标题中 : 右侧的空白添加:

    client.Headers.Add(String.Format("Authorization:{0}", "Fun-Kitty"));
    client.Headers.Add(String.Format("X-Requested-With:{0}", "PowerFlower"));
    

    或者,使用带有 2 个字符串参数的重载:

    client.Headers.Add("Authorization", "Fun-Kitty");
    client.Headers.Add("X-Requested-With", "PowerFlower");
    

    根据MSDN docs

    header 参数必须以“name:value”的格式指定。

    【讨论】:

    • 感谢您的回复。我设置标题的方式很好,我删除了空格只是为了测试但结果相同。这些设置(带或不带空格)可以在 Linqpad 或 Winform 应用程序中正常工作,但不能在 ASP.NET MVC 控制器中。
    • 我有一个理论@schmoopy。尝试将 create 转换为 HttpWebRequest: var client = (HttpWebRequest)WebRequest.Create(url);
    • 感谢您的建议。我试过了,但结果是一样的。
    • @schmoopy 好吧,现在我很好奇。拆解WebRequest代码,待命...
    • 没关系,非常感谢您的所有调查 - 同意这没有任何意义。我已经重新启动,清除了 asp.net 缓存 - 没有任何意义。再次感谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2010-09-14
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多