如何将 System.Net.Http.HttpResponseMessage 转换为 System.Web.Mvc.ActionResult

MAB*_*tal 5 c# asp.net-mvc httpclient actionresult httpresponsemessage

我正在编写简单的代理应用程序,它获取“URL 地址”,如“/xController/xMethod”,并通过 HttpClient 从另一个 Web 应用程序获取结果并显示结果。

我的方法:

public ActionResult Index(string urlAddress)
{
   var data = "";
   if (Request.ContentLength > 0 && httpRequestMessage != null)
       data = httpRequestMessage.Content.ReadAsStringAsync().Result;

    using (var client = new HttpClient())
    {
      // fill header and set target site url 

      // Make Post Data
      var buffer = System.Text.Encoding.UTF8.GetBytes(data);
      var byteContent = new ByteArrayContent(buffer);
      if (!String.IsNullOrWhiteSpace(Request.ContentType) && !String.IsNullOrEmpty(Request.ContentType))
           byteContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue(Request.ContentType);

       // make query string ....

       // sending request to target site         
       HttpResponseMessage response = null;
       if (Request.HttpMethod.ToUpper() == "POST")
             response = client.PostAsync(urlAddress + queryString, byteContent).Result;
       else
             response = client.GetAsync(any + queryString).Result;

    // My Problem is in here....
    return ....;              
  }
}
Run Code Online (Sandbox Code Playgroud)

我想在浏览器中显示我的请求,当响应是文件时,浏览器下载内容,当响应是 Json 时显示为 Json 等等。

(例如)我知道什么时候要显示 HTML 。我在用 :

ActionResult x = new ContentResult()
                {
                    Content = response.Content.ReadAsStringAsync().Result,
                    ContentType = response.Content.Headers.ContentType.MediaType
                };
                return x;
Run Code Online (Sandbox Code Playgroud)

或者当我想使用 JsonActionResult 作为 html 返回或使用 FileContentResult 在文件中返回时,但我想要快速可靠的解决方案将任何 HttpResponseMessage 转换为最佳 ActionResult 类

小智 6

我建议您使用 IHttpActionResult 作为 Web API 2 中引入的操作结果。您可以使用 ApiController 中的 ResponseMessage 方法将 HttpResponseMessage 转换为 IHttpActionResult。所以,你的控制器应该继承ApiController。

我的解决方案:

 public class TrainController : ApiController
{
    public IHttpActionResult SomeAction()
    {
        HttpResponseMessage responseMsg =
            new 
            HttpResponseMessage(HttpStatusCode.RedirectMethod);

        /*responseMsg = your implementation*/

        IHttpActionResult response = this.ResponseMessage(responseMsg);
        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)