所以我试图在我的项目中使用web Api并实现。
有两件事我不太确定
在我的web api中,我在控制器中有一个方法
public class FilesController : ApiController
{
[ActionName("GetFile")]
public HttpResponseMessage GetFile(string FileName, string CEQRNumber, string LatestMileStone)
{
var file = GetListofFilesByCEQRAndMilestone(FileName, CEQRNumber, LatestMileStone);
var path = file.FilePath;
var extension = file.FileExtention;
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(path, FileMode.Open,FileAccess.ReadWrite);
result.Content = new StreamContent(stream);
if (extension == ".pdf")
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
if (extension == ".xlsx" || extension == ".xls")
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
if (extension == ".zip")
result.Content.Headers.ContentType = new MediaTypeHeaderValue("aapplication/zip");
return result;
}
}
现在我不知道如何消费它。在我的Web服务器的主要mvc应用程序中。我有一个行动方法
public ActionResult GetFile(string fileName, string ceqrNum, string latestMS, string token)
{
string url = "https://xxx/api/Files/GetFile/" + fileName + "/" + ceqrNum + "/" + latestMS;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/pdf"));
Task<String> response = client.GetStringAsync(url);
// NOT SURE HOW TO CONVERT RESPONSE TO PDF
}
}
我的第二个问题是路由:在webApiConfig.cs中有一个默认路由设置
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
我注意到如果我必须有不同的参数,我必须在config
中添加所以我添加了
config.Routes.MapHttpRoute(
name: "GetFileList",
routeTemplate: "api/{controller}/{action}/{CEQRNumber}/{LatestMileStone}",
defaults: new
{
CEQRNumber = UrlParameter.Optional,
LatestMileStone = UrlParameter.Optional,
}
);
config.Routes.MapHttpRoute(
name: "GetFileForDownload",
routeTemplate: "api/{controller}/{action}/{FileName}/{CEQRNumber}/{LatestMileStone}",
defaults: new
{
Controller = "Files",
FileName = UrlParameter.Optional,
CEQRNumber = UrlParameter.Optional,
LatestMileStone = UrlParameter.Optional
}
);
现在,我可以使用一条默认路由,无论参数和动作名称如何,或者我必须编写新路径的每个不同动作和参数。
我将非常感谢您的回答。我试图理解web api的概念,因为这是我第一次使用它。
由于
答案 0 :(得分:0)
一些评论 -
不要以读/写方式打开文件,阅读就好了。
第二条路线很好,你不需要第一条路线,你也可以发布到以下路线:
api/{controller}/{FileName}/{CEQRNumber}/{LatestMileStone}
并从GetFiles中删除[ActionName]
属性。
更简单的是,您可以使用以下路线
api/{controller}
并将参数作为查询字符串传递。
所以它看起来像这样
config.Routes.MapHttpRoute(
routeTemplate: "api/{controller}"
);
您的网址将如下所示:
http://xxx/api/Files?FileName=foo&CEQRNumber=bar,&LatestMileStone
控制器代码:
public class FilesController : ApiController
{
public HttpResponseMessage GetFile(string FileName, string CEQRNumber, string LatestMileStone)
{
var file = GetListofFilesByCEQRAndMilestone(FileName, CEQRNumber, LatestMileStone);
var path = file.FilePath;
var extension = file.FileExtention;
var result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(path, FileMode.Open,FileAccess.Read);
result.Content = new StreamContent(stream);
// do the header work
return result;
}
}
对于您的客户端代码而不是ReadAsStringAsync,请使用
using (Stream responseStream = await response.Content.ReadAsStreamAsync())
{
// Read response stream
await ReadResponseStreamAsync(responseStream, fileName);
}
并且不要忘记验证客户端上的响应代码
有关如何从流中保存文件的评论:
private void ReadResponseStreamAsync(stream responseStream, string fileName)
{
using (var fileStream = File.Create("C:\\Path\\To\\" + fileName))
{
responseStream.CopyTo(fileStream);
}
}