【发布时间】:2017-03-29 06:28:20
【问题描述】:
我正在尝试使用/调用 MVC Web API 控制器方法,该方法将用于上传文件。我正在努力从我的 MVC 控制器中调用它。
这是我的 API 控制器代码
public class ImportController : ApiController
{
[HttpPost]
public bool PutImportFile(byte[] fileToBeImported, string nameOfTheFileToBeImported)
{
// I am doing file saving stuff here
}
}
我已经通过将方法更改为 HttpGet 测试了文件保存部分,并且当我直接从浏览器调用它时它的工作原理。我为此删除了参数。
但是,我无法弄清楚如何从客户端调用它。
我在下面试过了。
public class ImportFileModel
{
public byte[] FileToBeImported { get; set; }
public string NameOfTheFileToBeImported { get; set; }
}
下面的代码会接受用户上传的来自浏览器的文件并将其发布到 API 控制器以保存文件。
[HttpPost]
public async Task<JsonResult> Upload()
{
byte[] file;
string fileName = string.Empty;
if (Request.Files.Count > 0)
{
try
{
fileName = Request.Files[0].FileName;
using (MemoryStream ms = new MemoryStream())
{
Request.Files[0].InputStream.CopyTo(ms);
file = ms.ToArray();
}
//To do: get url from configuration
string url = "http://localhost:(port)/api/Import/PutImportFile";
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/bson"));
ImportFileModel request = new ImportFileModel
{
FileToBeImported = file,
NameOfTheFileToBeImported = fileName
};
MediaTypeFormatter bsonFormatter = new BsonMediaTypeFormatter();
var result = await client.PostAsync(url, request, bsonFormatter);
HttpResponseMessage response = result.EnsureSuccessStatusCode();
}
}
catch (Exception ex)
{
// exception handling here
}
}
return Json(true, JsonRequestBehavior.AllowGet);
}
最后一行出现异常。
HttpResponseMessage response = result.EnsureSuccessStatusCode();
抛出404 not found 错误。
我也尝试过使用 HttpWebRequest 从控制台应用程序中进行相同的操作。它也会抛出同样的错误。
【问题讨论】:
-
尝试明确定义路由,可能行得通。
-
@MUT 我相信,你是对的。因为它在将参数捆绑到单个对象后起作用。我还将尝试做出明确的路线定义,看看它是否也能以这种方式工作。但我想知道,它如何在没有定义显式路由的普通 MVC 控制器中工作,而不是在 Web API 控制器中工作。
标签: c# asp.net-mvc file-upload asp.net-web-api2