【问题标题】:Creating an MVC Controller Proxy for a Web API Controller为 Web API 控制器创建 MVC 控制器代理
【发布时间】:2023-04-01 05:08:01
【问题描述】:

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

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

我需要创建一个 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 控制器中,我在 request.CreateResponse() 行上收到 InvalidOperationException。错误说:

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

任何帮助将不胜感激。我已经搜索了 Google 和 StackOverflow,但找不到在 MVC 和 Web API 之间创建此代理的好解决方案。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您可以通过在控制器中创建一些 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);
            }
        }
    }
    

    【讨论】:

    • 那不是总是返回 200 状态码吗?我需要保留来自 Web API 的响应的任何状态代码。另外,我不希望 Web API 序列化对象,代理反序列化它,然后 MVC 再次序列化对象。
    • 你总是可以根据你从 web api 调用获得的结果返回你想要的状态代码
    • 序列化、反序列化、再序列化的问题呢?
    • 另外,如果 Web Api 返回错误消息/响应会发生什么。 WebApiCaller 会尝试将其反序列化为预期的对象类型,这会引发错误,对吗?
    • 已修改。没有反序列化。详情看这里:stackoverflow.com/a/9777889/1235390
    猜你喜欢
    • 1970-01-01
    • 2014-06-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多