为Web API Controller创建一个MVC Controller代理

6
我有一个MVC项目,该项目对外开放。我还有一个内部的Web API项目。由于某些原因,我无法直接公开Web API项目,也不能在我的MVC项目中添加Web API控制器。
我需要创建一个MVC控制器作为Web API控制器的代理。我需要从MVC控制器获得的响应看起来像是直接调用Web API。
最佳实现方法是什么?是否有更好的方法?
我目前遇到了错误,如何解决?
以下是我目前的代码:
MyMVCController
[HttpGet]
public HttpResponseMessage GetData(HttpRequestMessage request)
    {
        ...

        var response = proxy.GetData();

        return request.CreateResponse();
    }

MyProxyClass

public HttpResponseMessage GetData()
    {
        ...
        return HttpRequest(new HttpRequestMessage(HttpMethod.Get, uri));
    }

private HttpResponseMessage HttpRequest(HttpRequestMessage message)
    {
        HttpResponseMessage response;

        ...

        using (var client = new HttpClient())
        {
            client.Timeout = TimeSpan.FromSeconds(120);
            response = client.SendAsync(message).Result;
        }

        return response;
    }

在MVC Controller中,我在request.CreateResponse()这一行代码上遇到了InvalidOperationException。错误提示说:
“请求没有关联配置对象,或者提供的配置为空。”
非常感谢您的帮助。我已经在Google和StackOverflow上搜索过,但是我还没有找到一个好的解决方案来创建MVC和Web API之间的代理。
谢谢!
1个回答

6

您可以通过在控制器中创建一些JsonResult操作来实现,该操作将返回调用Web API的结果。

public class HomeController : Controller
{
    public async Task<JsonResult> CallToWebApi()
    {
        return this.Content(
            await new WebApiCaller().GetObjectsAsync(),
            "application/json"
        );
    }
}

public class WebApiCaller
{
    readonly string uri = "your url";

    public async Task<string> GetObjectsAsync()
    {
        using (HttpClient httpClient = new HttpClient())
        {
            return await httpClient.GetStringAsync(uri);
        }
    }
}

1
那样做不会一直返回200状态码吗?我需要保留Web API响应的任何状态码。另外,我不希望Web API序列化对象,代理反序列化它,然后MVC再次序列化对象。 - jkruer01
你可以根据从 Web API 调用中获得的结果返回所需的状态码。 - aleha_84
序列化、反序列化、再次序列化的问题怎么处理? - jkruer01
另外,如果 Web Api 返回错误消息/响应会发生什么情况呢?WebApiCaller 将尝试将其反序列化为预期的对象类型,这将导致抛出错误,对吧? - jkruer01
修改后的内容。不需要反序列化。详情请查看此处:https://dev59.com/m2kw5IYBdhLWcg3wmruH#9777889 - aleha_84

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接