【问题标题】:Illegal characters in path depending on User-Agent?路径中的非法字符取决于用户代理?
【发布时间】:2015-11-13 14:20:23
【问题描述】:

我对 ASP.NET 有两个相同的调用,唯一的区别是用户代理。我用 Fiddler 重现了这个问题。

HTTP 请求行是:

PUT http://localhost/API/es/us/havana/club/tickets/JiWOUUMxukGVWwVXQnjgfw%7C%7C214 HTTP/1.1

适用于:

User-Agent: Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2307.2 Safari/537.36

失败:

User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4

其他一切都 100% 相同。

【问题讨论】:

  • 它是如何失败的?返回的状态码是什么?服务器端有任何错误跟踪吗?
  • “/Api”应用程序中的服务器错误。路径中的非法字符。 ArgumentException: Illegal characters in path.] System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional) +13766780 System.IO.Path.GetExtension(String path) +28 System.Web.WebPages.DefaultDisplayMode.TransformPath(String virtualPath,字符串后缀)+49 System.Web.WebPages.DefaultDisplayMode.GetDisplayInfo(HttpContextBase httpContext, String virtualPath, Func`2 virtualPathExists) +33 System.Web.WebPages.DisplayModeProvider.GetDisplayInfoForVirtualPath(String virtualPath, HttpContextBase,..
  • 让我澄清一下这个问题似乎与 Fiddler 无关。我只是用 fiddler 来跟踪调用。
  • 嗨,它从来没有进入我能找到的钩子(消息处理程序、授权属性等),所以我决定对密钥进行 base64 编码。似乎双管 (||) 和代理的组合是问题所在。 http 编码之前的原始密钥是 JiWOUUMxukGVWwVXQnjgfw||214。谢谢你的建议..

标签: http asp.net-web-api fiddler user-agent


【解决方案1】:

就我而言,根本原因是 MVC 的 MultipleViews 和 DisplayMode 提供程序。这允许 MVC 应用程序神奇地获取特定于设备的视图;例如 自定义.cshtml customer.mobile.cshtml

这篇文章很好地解释了该功能以及如何关闭它: https://msdn.microsoft.com/en-us/magazine/dn342866.aspx

我通过将 Microsoft.AspNet.WebPages 包添加到我的项目并在我的启动中添加对此代码的调用来解决此问题(global.asax 中的 application_start 或如果使用 OWIN,则使用 OwinStartup 属性装饰的方法):

public static void RegisterDisplayModes()
{
    // MVC has handy helper to find device-specfic views. Ain't no body got     time for that.
    dynamic modeDesktop = new DefaultDisplayMode("") { ContextCondition = (c => { return true; }) };
    dynamic displayModes = DisplayModeProvider.Instance.Modes;
    displayModes.Clear();
    displayModes.Add(modeDesktop);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2018-02-28
    • 2015-07-31
    相关资源
    最近更新 更多