請教一個 MVC 自定義路由的問題


這是一個Web Api項目 ,已經做了如下配置:

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.Routes.MapHttpRoute(
                 "WithActionApi",
                 "api/{controller}/{action}/{serverfile}"
             );

            // Web API routes
            config.MapHttpAttributeRoutes();

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

希望的Url :
http://localhost:61642/api/FileService/DownLoadFile/a.exe

但是會報404,而去后后面的 .exe 能夠正確調用到 DownLoadFile方法,但是這樣就缺少文件的擴展名了
另外,如果最后的參數,如果是 /soft/a.exe,又該怎么辦呢?
各們高手幫忙看下這個路由該怎樣定義呢?謝謝

3 个解决方案

#1


路由是對的
你的DownLoadFile方法怎么不貼出來? 

其實采用默認的api路徑配置只有創建一個DownLoadFile的控制器就行了
至於文件路徑 soft/a.exe a.exe等 只要在請求時候將路徑base64encode一下傳過來就行了
 
最新版本的web api里面加了restful特性

只要在方法名上加上特性[Route("~api/authors/{authorId}/books")]即可配置路由
http://www.asp.net/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing

#2


引用 1 樓 zhuankeshumo 的回復:
路由是對的
你的DownLoadFile方法怎么不貼出來? 

其實采用默認的api路徑配置只有創建一個DownLoadFile的控制器就行了
至於文件路徑 soft/a.exe a.exe等 只要在請求時候將路徑base64encode一下傳過來就行了
 
最新版本的web api里面加了restful特性

只要在方法名上加上特性[Route("~api/authors/{authorId}/books")]即可配置路由
http://www.asp.net/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing




public class FileServiceController : ApiController
    {
        [HttpGet]
        [HttpPost]
        public HttpResponseMessage DownLoadFile(string serverfile)
        {
            FileInfo fi = new FileInfo(@"C:\電影\Man.Of.Steel.2013.720p.BluRay.x264-Felony [PublicHD]_超人.鋼鐵之軀\man.of.steel.2013.720p.bluray.x264-felony.mkv");

            //CusStreamReader stream = new CusStreamReader(new FileStream(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.Read), 0, fi.Length);
            Stream stream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.Read);
            MediaTypeHeaderValue mediaType = MediaTypeHeaderValue.Parse("application/octet-stream");
            HttpResponseMessage response = null;
            
            try
            {
                if (Request.Headers.Range != null)
                {
                    response = Request.CreateResponse(HttpStatusCode.PartialContent);
                    response.Content = new ByteRangeStreamContent(stream, Request.Headers.Range, mediaType);
                    return response;
                }
                else
                {
                    response = new HttpResponseMessage(HttpStatusCode.OK);
                    response.Content = new StreamContent(stream);

                    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
                    response.Content.Headers.ContentDisposition.Name = fi.Name;
                    response.Content.Headers.ContentDisposition.FileName = fi.Name;

                    response.Content.Headers.ContentLength = fi.Length;
                    response.Content.Headers.ContentType = mediaType;

                    return response;
                }
            }
            catch (Exception)
            {

                return null;
            }
        }
 

先謝謝, 這是 DownLoadFile 的代碼, 如果不行的話, 我就把參數轉為BASE64吧。

#3


意思是 WEB API 2 不需要再注冊自定義路由了, 而是可以像 WCF那樣,在方法加一個路由標簽? 這樣太爽了!!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com