C# WebApi空间中的MVC5属性路由

C# WebApi空间中的MVC5属性路由,c#,asp.net-mvc,asp.net-mvc-routing,asp.net-web-api-routing,attributerouting,C#,Asp.net Mvc,Asp.net Mvc Routing,Asp.net Web Api Routing,Attributerouting,我正在使用MVC控制器在一个Web Api项目中创建一个动态JavaScript文件(我对这一部分不满意,但我正在努力保持与以前版本的兼容性) 客户端正在使用URL,如: ~/api/assessments/{id:int}.js?locale={locale?} 我创建了一个MVCJavaScriptController,并添加了如下方法: [Route("~/api/data/{id:int}.js")] public async Task<PartialViewRe

我正在使用MVC控制器在一个Web Api项目中创建一个动态JavaScript文件(我对这一部分不满意,但我正在努力保持与以前版本的兼容性)

客户端正在使用URL,如:

~/api/assessments/{id:int}.js?locale={locale?}
我创建了一个MVC
JavaScriptController
,并添加了如下方法:

    [Route("~/api/data/{id:int}.js")]
    public async Task<PartialViewResult> GetData(int id, string locale)
    {
        try
        {
            Response.ContentType = "application/javascript";
            ViewBag.Locale = locale ?? "en";
            var model = await this._dataService.GetData(id.ToString());
            return PartialView(model);
        }
        catch (Exception ex)
        {
            this._logger.Error("Task<PartialViewResult> GetData(int, string)", ex);
            return PartialView("JavaScriptError", SelectException(ex));
        }
    }
[Route(“~/api/data/{id:int}.js”)]
公共异步任务GetData(int id,字符串区域设置)
{
尝试
{
Response.ContentType=“应用程序/javascript”;
ViewBag.Locale=Locale??“en”;
var model=等待此消息。_dataService.GetData(id.ToString());
返回局部视图(模型);
}
捕获(例外情况除外)
{
此.u logger.Error(“任务获取数据(int,string)”,ex);
返回PartialView(“JavaScriptError”,SelectException(ex));
}
}
但是,当我尝试调用此调用时,我得到一个404:

<Error>
    <Message>
        No HTTP resource was found that matches the request URI 'http://.../api/data/29.js?locale=en'.
    </Message>
    <MessageDetail>
        No type was found that matches the controller named 'data'.
    </MessageDetail>
</Error>

未找到与请求URI名称匹配的HTTP资源http://.../api/data/29.js?locale=en'.
未找到与名为“data”的控制器匹配的类型。

我认为WebApi“~/api”前缀是走在mvc5路线上的,尽管我认为它可能是完全不同的。如何在指定的URL上呈现此MVC视图?

在路线注册期间是否调用
MapHttpAttribute路由()


请参见

您不需要将查询字符串参数或相对路径作为路由的一部分:

    [Route("api/data/{id:int}.js")]
    protected async Task<PartialViewResult> GetData(int id, string locale)
    {
        try
        {
            Response.ContentType = "application/javascript";
            ViewBag.Locale = locale ?? "en";
            var model = await this._dataService.GetData(id.ToString());
            return PartialView(model);
        }
        catch (Exception ex)
        {
            this._logger.Error("Task<PartialViewResult> GetData(int, string)", ex);
            return PartialView("JavaScriptError", SelectException(ex));
        }
    }
[路由(“api/data/{id:int}.js”)]
受保护的异步任务GetData(int id、字符串区域设置)
{
尝试
{
Response.ContentType=“应用程序/javascript”;
ViewBag.Locale=Locale??“en”;
var model=等待此消息。_dataService.GetData(id.ToString());
返回局部视图(模型);
}
捕获(例外情况除外)
{
此.u logger.Error(“任务获取数据(int,string)”,ex);
返回PartialView(“JavaScriptError”,SelectException(ex));
}
}
因为只有API的特定部分是实际模板化的(“文件”的名称),所以您只需要将其作为路由的一部分包含进去

但是,您仍然会遇到一些问题,.NET会尝试将对.js的请求视为对文件的请求

要使其工作,您可能必须启用:



但是,您确实需要意识到启用此功能。如果您没有正确设置NTFS权限,您将面临潜在的攻击,远程用户可以访问文件系统上的文件。

嗯,看来我是对的;WebApi路由机制在MVC属性路由上执行步骤。最后,我不得不在我的
WebApiConfig.cs
文件中填写以下行:

//config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional});

之后,MVC路由按预期工作。

路由属性的名称空间是什么?我没有指定名称空间。确保它是
System.Web.Http.RouteAttribute
而不是
System.Web.MVC.RouteAttribute
@haim770,这似乎没有什么区别。嗯,输入有意义,但这似乎没有什么区别。
//config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional});