【问题标题】:WebAPI GetRouteData works in self host, fails on web hostWebAPI GetRouteData 在自己的主机上工作,在 web 主机上失败
【发布时间】:2013-11-22 10:47:11
【问题描述】:

我有正在发布的 JSON 数据,它通过完整的 URL 引用其他资源,如下所示:

{
    jobItems : [
        "http://example.com/item/3",
        "http://example.com/item/5" 
    ]
}

在我的 WebAPI 控制器中,我通过重用相应的路由来解析这些 URL:

private static IHttpRouteData ParseLink(
    this ApiController controller,
    string routeName,
    Uri uri)
{
    var fakeRequest = new HttpRequestMessage(HttpMethod.Get, uri);
    string virtualPathRoot = controller.Configuration.VirtualPathRoot;
    var route = controller.Configuration.Routes[routeName];
    return route.GetRouteData(virtualPathRoot, fakeRequest);
}

以上内容在独立的自托管 WebAPI 部署中运行良好。但是,当我在 Web 主机 (IIS) 上的 ASP.NET MVC4 应用程序中部署 WebAPI 控制器时,GetRouteData 会引发以下异常:

System.NotImplementedException
   at System.Web.HttpContextBase.get_Items()
   at System.Web.Http.WebHost.Routing.HttpContextBaseExtensions.GetHttpRequestMessage(HttpContextBase context)
   at System.Web.Http.WebHost.Routing.HttpWebRoute.ProcessConstraint(HttpContextBase httpContext, Object constraint, String parameterName, RouteValueDictionary values, RouteDirection routeDirection)
   at System.Web.Routing.Route.ProcessConstraints(HttpContextBase httpContext, RouteValueDictionary values, RouteDirection routeDirection)
   at System.Web.Routing.Route.GetRouteData(HttpContextBase httpContext)
   at System.Web.Http.WebHost.Routing.HostedHttpRoute.GetRouteData(String rootVirtualPath, HttpRequestMessage request)

怎么了?我该如何解决这个问题?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    您可以尝试以下方法来修复它:

    private static IHttpRouteData ParseLink(this ApiController controller, Uri uri)
    {
        var fakeRequest = new HttpRequestMessage(HttpMethod.Get, uri);
    
        return controller.Configuration.Routes.GetRouteData(fakeRequest);
    }
    

    【讨论】:

    • 这个稍微简单一点,但还是会抛出同样的异常。
    • 嗯...我确实在 webhost 场景中尝试过自己并且这很有效...您使用的是哪个版本的 Web API? (比如你使用的是哪个版本的Microsoft.AspNet.WebApi.Core nuget 包?)
    • <package id="Microsoft.AspNet.WebApi.Core" version="4.0.20710.0" targetFramework="net45" />
    • 好的,我试过4.0.30506.0这个版本...可能这是您使用的版本中的一个错误...可能您应该将其更新到上述版本甚至是最新版本Web API 5.0
    • 4.0.30506.0 遇到了同样的异常。但至少现在我知道我的用例有一些特别之处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2021-04-16
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    相关资源
    最近更新 更多