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


  • 相关阅读:
    WCF 第十三章 可编程站点 为站点创建操作
    WCF 第十三章 可编程站点 所有都与URI相关
    WCF 第十二章 对等网 使用自定义绑定实现消息定向
    WCF 第十三章 可编程站点 使用WebOperationContext
    Using App.Config for user defined runtime parameters
    WCF 第十三章 可编程站点
    WCF 第十三章 可编程站点 使用AJAX和JSON进行网页编程
    WCF 第十二章 总结
    WCF 第十三章 可编程站点 使用WebGet和WebInvoke
    WCF 第十三章 可编程站点 URI和UriTemplates
  • 原文地址:https://www.cnblogs.com/lipanpan/p/4147244.html
Copyright © 2011-2022 走看看