如何在URL 末尾调用Web API 操作?
How to call Web API action with a dot at the end of the URL?
这是我学习实现从网络下载文件的linkapi,我尝试用这些URL
下载文件
http://localhost:49932/api/simplefiles/1.zip <--不工作,找不到投诉方法
http://localhost:49932/api/simplefiles/1 <--可以调用动作名称,但是为什么?
我知道 URL 中的“.zip”扩展名会导致失败,但我就是不明白,也不确定哪里出了问题,谁能解释一下?
界面
public interface IFileProvider
{
bool Exists(string name);
FileStream Open(string name);
long GetLength(string name);
}
控制器
public class SimpleFilesController : ApiController
{
public IFileProvider FileProvider { get; set; }
public SimpleFilesController()
{
FileProvider = new FileProvider();
}
public HttpResponseMessage Get(string fileName)
{
if (!FileProvider.Exists(fileName))
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
FileStream fileStream = FileProvider.Open(fileName);
var response = new HttpResponseMessage();
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentDisposition
= new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType
= new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentLength
= FileProvider.GetLength(fileName);
return response;
}
}
WebAPIConfig
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{filename}",
defaults: new { id = RouteParameter.Optional }
);
默认情况下,IIS 会阻止访问任何它无法识别的文件类型。如果 URL 中有一个点 (.),IIS 会假定它是一个文件名并阻止访问。
要允许 IIS 站点上 URL 中的点(可能是域 names/email addresses/etc。在 MVC 路由路径中),您必须进行一些更改。
快速修复
一个简单的选择是在末尾附加一个 /。这告诉 IIS 它是一个文件路径而不是一个文件。
http://localhost:49932/api/simplefiles/1.zip
变为 http://localhost:49932/api/simplefiles/1.zip/
.
然而,这并不理想:手动输入 URL 的客户可能会忽略前导斜杠。
您可以通过添加以下内容告诉 IIS 不要打扰您:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<system.webServer>
这是我学习实现从网络下载文件的linkapi,我尝试用这些URL
下载文件http://localhost:49932/api/simplefiles/1.zip <--不工作,找不到投诉方法 http://localhost:49932/api/simplefiles/1 <--可以调用动作名称,但是为什么?
我知道 URL 中的“.zip”扩展名会导致失败,但我就是不明白,也不确定哪里出了问题,谁能解释一下?
界面
public interface IFileProvider
{
bool Exists(string name);
FileStream Open(string name);
long GetLength(string name);
}
控制器
public class SimpleFilesController : ApiController
{
public IFileProvider FileProvider { get; set; }
public SimpleFilesController()
{
FileProvider = new FileProvider();
}
public HttpResponseMessage Get(string fileName)
{
if (!FileProvider.Exists(fileName))
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
FileStream fileStream = FileProvider.Open(fileName);
var response = new HttpResponseMessage();
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentDisposition
= new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType
= new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentLength
= FileProvider.GetLength(fileName);
return response;
}
}
WebAPIConfig
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{filename}",
defaults: new { id = RouteParameter.Optional }
);
默认情况下,IIS 会阻止访问任何它无法识别的文件类型。如果 URL 中有一个点 (.),IIS 会假定它是一个文件名并阻止访问。
要允许 IIS 站点上 URL 中的点(可能是域 names/email addresses/etc。在 MVC 路由路径中),您必须进行一些更改。
快速修复
一个简单的选择是在末尾附加一个 /。这告诉 IIS 它是一个文件路径而不是一个文件。
http://localhost:49932/api/simplefiles/1.zip
变为 http://localhost:49932/api/simplefiles/1.zip/
.
然而,这并不理想:手动输入 URL 的客户可能会忽略前导斜杠。
您可以通过添加以下内容告诉 IIS 不要打扰您:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<system.webServer>