我有一个外部公开的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之间创建这个代理。
谢谢!
答案 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);
}
}
}