zoukankan      html  css  js  c++  java
  • MVC4 路由参数带点 文件名后缀导致错误

    错误描述

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

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

    image

    项目中路由配置:

    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>

    image


    参考资源:

    博问: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


  • 相关阅读:
    关于日志造成的频繁的IO
    PHP
    gitignore
    Linux安装gradle
    Ambari和ClouderManager分析对比
    原生hadoop生态系统组件安装文档
    hive的数据类型和数据模型
    hive概述
    使用binlog和canal从mysql实时抽取数据
    canal概述
  • 原文地址:https://www.cnblogs.com/lipanpan/p/4147244.html
Copyright © 2011-2022 走看看