C# WebApi空间中的MVC5属性路由
我正在使用MVC控制器在一个Web Api项目中创建一个动态JavaScript文件(我对这一部分不满意,但我正在努力保持与以前版本的兼容性) 客户端正在使用URL,如: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
~/api/assessments/{id:int}.js?locale={locale?}
我创建了一个MVCJavaScriptController
,并添加了如下方法:
[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});