为Web API控制器创建MVC控制器代理

时间:2014-12-29 13:51:06

标签: c# asp.net asp.net-mvc asp.net-web-api proxy

我有一个外部公开的MVC项目。我有一个内部Web API项目。

由于我无法控制的原因,我无法直接公开Web API项目,也无法将Web API控制器添加到我的MVC项目中。

我需要创建一个MVC控制器,它将充当Web API控制器的代理。我需要MVC Controller的响应看起来好像是直接调用了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。错误说:

  

请求没有关联的配置对象,或者提供的配置为null。

非常感谢任何帮助。我搜索过谷歌和StackOverflow,但我还没有找到一个很好的解决方案,可以在MVC和Web API之间创建这个代理。

谢谢!

1 个答案:

答案 0 :(得分:4)

您只需在控制器中创建一些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);
        }
    }
}