【问题标题】:Call MVC web API controller method from client从客户端调用 MVC Web API 控制器方法
【发布时间】: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


【解决方案1】:

您的 Web API 方法 PutImportFile 设置为接收两个值,而不是单个模型;因此,无法识别您的 HttpClient 呼叫(未找到匹配的路由)。更改您的 Web API 方法以接收模型:

public class ImportController : ApiController
{
    [HttpPost]
    public bool PutImportFile(ImportFileModel fileInfo)
    {   
        //Your code to save the file...            
    }
}

【讨论】:

  • 试过了,但还是达不到方法。错误类型已从 404 更改为 500,但是,它没有到达控制器。
  • 有意思,好像找到了方法,但是出了点问题。如果你在方法的入口处断点,它会命中吗?
  • 成功了!!!我从 SO 的其他问题中添加了 Web 配置部分。 &lt;modules runAllManagedModulesForAllRequests="true" /&gt;&lt;system.webServer&gt;。删除它,它的工作!万分感谢!没想到会是路由问题。
  • 太棒了!也可以从浏览器中对其进行测试 - 您可能需要更改 JSON 的发送方式,因为该方法现在需要一个对象。
  • 幸运的是,该部分仍在等待写入;所以我将致力于发送一个 JSON 对象。你让我今天一整天都感觉很好!干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多