MVC4 路由参数带点 文件名后缀导致错误

错误描述

最近在研究office在线预览,用到mvc4  apicontroller 需要传参是文件名,如test.docx导致错误“指定的目录或文件在 Web 服务器上不存在”,

请求的路径如:api/wopi/files/test.docx?access_token=access_token。如下截图:

项目中路由配置:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            //office web apps
            config.Routes.MapHttpRoute(
                 name: "Contents",
                 routeTemplate: "wopi/files/{name}/contents",
                 defaults: new { controller = "files", action = "GetFile" }
             );
            config.Routes.MapHttpRoute(
                name: "FileInfo",
                routeTemplate: "api/wopi/files/{name}",
                defaults: new { controller = "files", action = "GetFileInfo", name = RouteParameter.Optional }
            );
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // 取消注释下面的代码行可对具有 IQueryable 或 IQueryable<T> 返回类型的操作启用查询支持。
            // 若要避免处理意外查询或恶意查询,请使用 QueryableAttribute 上的验证设置来验证传入查询。
            // 有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=279712。
            //config.EnableQuerySupport();
        }
    }

控制器方法,注意这里是apicontroller

public class filesController : ApiController
    {
        public CheckFileInfo GetFileInfo(string name, string access_token)
        {

            string _access_token = access_token;

            var file = HostingEnvironment.MapPath("~/App_Data/" + name);//从硬盘中获取name文件

            FileInfo info = new FileInfo(file);
            if (!info.Exists) return null;//不存在返回
            var hasher = SHA256.Create();
            byte[] hashValue;
            using (Stream s = File.OpenRead(file))
            {
                hashValue = hasher.ComputeHash(s);
            }
            string sha256 = Convert.ToBase64String(hashValue);
            var json = new CheckFileInfo

            {

                BaseFileName = info.Name,//"test.docx",

                OwnerId = "admin",

                Size = info.Length,

                SHA256 = "+17lwXXN0TMwtVJVs4Ll+gDHEIO06l+hXK6zWTUiYms=",

                Version = "GIYDCMRNGEYC2MJREAZDCORQGA5DKNZOGIZTQMBQGAVTAMB2GAYA===="

            };

            return json;

        }
        public HttpResponseMessage GetFile(string name, string access_token)
        {

            try
            {

                string _access_token = access_token;

                var file = HostingEnvironment.MapPath("~/App_Data/" + name);//name是文件名

                var rv = new HttpResponseMessage(HttpStatusCode.OK);

                var stream = new FileStream(file, FileMode.Open, FileAccess.Read);

                rv.Content = new StreamContent(stream);

                rv.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

                return rv;

            }

            catch (Exception ex)
            {

                var rv = new HttpResponseMessage(HttpStatusCode.InternalServerError);

                var stream = new MemoryStream(UTF8Encoding.Default.GetBytes(ex.Message ?? ""));

                rv.Content = new StreamContent(stream);

                return rv;

            }

        }
    }

解决办法

在webconfig中节点system.webserver节点下添加节点<modules runAllManagedModulesForAllRequests="true" />,并将iis模式设置成集成模式(iis->应用程序池->找到你的网站右键“高级设置”,设置成集成模式)。

因为只有iis在集成模式下,system.webserver的设置才会生效。

<system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0"
           path="*."
           verb="*"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>



参考资源:

博问:http://q.cnblogs.com/q/54613/

如何:为 IIS 7.0 配置 <system.webServer> 节:http://msdn.microsoft.com/zh-cn/library/bb763179.aspx
IIS配置.html的映射问题:http://blog.csdn.net/songz210/article/details/3216101



MVC4 路由参数带点 文件名后缀导致错误

时间: 2024-11-09 05:36:05

MVC4 路由参数带点 文件名后缀导致错误的相关文章

vue.js路由参数简单实例讲解------简单易懂

vue中,我们构建单页面应用时候,一定必不可少用到vue-router vue-router 就是我们的路由,这个由vue官方提供的插件 首先在我们项目中安装vue-router路由依赖 第一种,我们提供命令行来安装 npm install vue-router --save 第二种,我们直接去官方github下载 https://github.com/vuejs/vue-router 路由参数设置 1,实例化一个路由,然后路由映射表中的地址带参数,这个参数就是路由的参数 接着给映射表中的路由设

十、find命令;文件名后缀

一.find命令 格式:find [路径] [参数]. 常用参数: -atime +n/-n:表示访问或执行时间大于或小于n天的文件. -ctime +n/-n:表示写入.更改iNode属性(如更改所有者.权限或者链接)的时间大于或小于n天的文件. -mtime +n/-n:表示写入时间大于或小于n天的文件,该参数用得很多. 示例命令: # find /tmp4_6/ -mtime -1 上例中,-mtime -1表示,mtime在1天之内的文件,单位是天.而-mtime +10表示mtime在

原来 laravel 路由 参数可以为可选。。。 很灵活

基本路由 您的应用程序的绝大多数路由将在 app/routes.php 文件中定义.Laravel 中最简单的路由由一个 URI 和一个闭包调用组成. 基本 GET 路由 复制代码代码如下: Route::get('/', function(){return 'Hello World';}); 基本 POST 路由 复制代码代码如下: Route::post('foo/bar', function(){return 'Hello World';}); 注册一个路由以响应所有 HTTP 方法 复制

AngularJS路由系列(2)--刷新、查看路由,路由事件和URL格式,获取路由参数,路由的Resolve

本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● 刷新路由● 查看当前路由以及所有路由● 路由触发事件● 获取路由参数 ● 路由的resolve属性● 路由URL格式 项目文件结构 node_modules/ public/.....app/..........bower_components/...............toastr/....................toastr.min.css....................toastr.min

OpenGrok添加根据文件名后缀进行查询过滤的功能

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">OpenGrok默认会将*.o *.so这些二进制文件也加入索引(其实没什么坏处),如果想在查询时过滤这些文件,怎么做?</span> 要点: https://github.com/OpenGrok/OpenGrok/blob/master/src/org/opensolar

2.23——2.25find命令(上中下);2.26 文件名后缀

2.23 find命令(上) 快捷键: Ctrl + l  :清屏 Ctrl + d :退出终端(相当于执行了:exit 或logout) Ctrl + c : 强制中断 Ctrl + u : 在命令输入行,删除光标前的字符串 Ctrl + e :  光标移到末尾 Ctrl + a :  光标移到开始 which :搜索命令文件(从echo $PATH环境变量下的目录查找) find :搜索文件 1. find 精准搜索:find 搜索路径 -name "精准关键词" [[email 

第二周第五节、find命令及文件名后缀

find命令 find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录和文件全部进行显示.语法:find(选项)(参数)选项:-name<范本样式>:指定字符串作为寻找文件或目录的范本样式:-iname<范本样式>:此参数的效果和指定"-name"参数类似,但忽略字符大小写的差别:-type<文件类型>:只寻找符合指定的

Angular2学习笔记——在子组件中拿到路由参数

工作中碰到的问题,特此记录一下. Angular2中允许我们以`path\:id\childPath`的形式来定义路由,比如: export const appRoutes: RouterConfig = [{ path: 'app/:id', component: AppComponent, children: [ { path: 'share', component: AppShareComponent }, { path: 'issue', component: AppIssueCompo

MVC在页面View上获取当前控制器名称、Action名称以及路由参数

有时候在封装MVC通用控件时需要在页面上获取这些数据. 用以下方法即可: //获取控制器名称: ViewContext.RouteData.Values["controller"].ToString(); //获取Action名称: ViewContext.RouteData.Values["action"].ToString(); //获取路由参数值: ViewContext.RouteData.Values[名称].ToString(); //如:ViewCon