ASP.NET Core 7 MVC - 如何调用控制器并从另一个 MVC 应用获取关联的视图

ASP.NET Core 7 MVC - How to call a controller and get the associated view from another MVC app

提问人:Andre 提问时间:11/15/2023 最后编辑:marc_sAndre 更新时间:11/15/2023 访问量:31

问:

我们有几个 MVC 应用程序,它们为不同的客户端执行不同的工作。例如,我们有一个 MVC 应用,用于将计费数据包提交到计费客户端。

我们将现有应用程序转换为 MVC,此应用程序需要与计费应用程序集成,以便我们可以在 MVC 转换应用程序中利用计费应用程序中的控制器和视图。

我们真的不想重新开发这些页面和控制器,或者拥有多个副本,因此,如果我们更改一个副本,我们必须记住更改所有副本。

我查看了服务,除非我误解了它是如何工作的,否则每当计费应用程序发生变化时,我们都必须重新编译和重新部署我们的主应用程序。AddApplicationPart

我也看过,但我没有看到可以使用这种方法传递参数值的方法。Redirect()

有没有办法在计费应用程序上调用控制器并将生成的视图返回到我的调用应用程序?

我试过使用,但没有运气。HttpClient

using (HttpClient client = new HttpClient())
{
    client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");

    string baseAddress = string.Empty;

    // set base address
    if (baseAddress != string.Empty)
    {
        HttpResponseMessage response = client.PostAsJsonAsync($"{baseAddress}Home/Login/", model).Result;

        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadFromJsonAsync<IActionResult>().Result;
        }
    }
}

上面的代码在目标应用程序中调用正确的控制器,但模型是完全空的。我已确认在调用时已填充模型。

如果我将标签添加到函数中,则上面的代码将返回未找到错误。[HttpPost]Login

非常感谢任何指导。

asp.net-core-mvc

评论


答:

0赞 Ruikai Feng 11/15/2023 #1

您似乎希望当前的应用程序用作网关?

您应该将响应内容读取为 Byte 数组 /stream,并根据您的要求重新运行 html 文件

一个最小的例子:

public async Task<IActionResult> ExistPage()
{
    using var httpclient=new HttpClient() { BaseAddress= ....... };            
    var response = await httpclient.GetAsync("/Home/Index");
    // check if success here yourself
    var  responsestream = await response.Content.ReadAsStreamAsync();
    return File(responsestream, "text/html");
}

结果:enter image description here

上面的代码在目标应用程序中调用了正确的控制器, 但是,模型是完全空的

由于您将模型作为带有代码的 json 发送:,因此您已经检查了另一个 App 的控制器,如果参数与属性相连接client.PostAsJsonAsync($"{baseAddress}Home/Login/", model)[FromBody]

请查看此文档与模型绑定相关

以及如何使用 HttpClient 发送 FormData 的代码:

using var httpclient=new HttpClient() { BaseAddress= ..... };
var requestmessage = new HttpRequestMessage(HttpMethod.Post,"yourrequestpath");
var formData = new MultipartFormDataContent();
formData.Add(new StringContent("val"), "key");
....//add key -value pairs one by one
requestmessage.Content = formData;
var response = await httpclient.SendAsync(requestmessage);

评论

0赞 Andre 11/16/2023
谢谢你,[FromBody],我知道......不知道我为什么空白了......您对返回流的建议似乎是我需要的。