gpt4 book ai didi

c# - MVC Controller 将整个模型发布到远程 api 操作

转载 作者:行者123 更新时间:2023-11-30 16:50:42 25 4
gpt4 key购买 nike

我想从我的前端 MVC 站点调用一个 API。这两个应用程序在同一网络上的不同服务器上运行。

API Controller 的功能类似于:

[AllowCrossSiteJson]
public class VerifyMyModelController : ApiController
{
[HttpPost]
public MyResponse Post(MyModel model)
{
return MyHelper.VerifyMyModel(model);
}

[HttpPost]
public async Task<MyResponse> PostAsync(MyModel model)
{
return await MyHelper.VerifyMyModel(model);
}
// ... Gets below as well
}

其中 MyHelper 执行模型验证、数据库查找等...并返回带有响应代码、数据库 ID 等的通用响应对象

我的前端 MVC 站点有一个用户填写的表单,该数据被发布到本地 Controller ,我想将其转发到 API。公众无法访问 API 应用程序,因此我无法使用 AJAX 等直接向其发布。它必须来自站点 Controller 。

我尝试了以下操作,但得到了 500 内部服务器错误作为响应

[HttpPost]
public async Task<MyResponse> VerifyAsync(MyModel model)
{
var MyServer = ConfigurationManager.AppSettings["MyServer"];
var json = Newtonsoft.Json.JsonConvert.SerializeObject(model);

var requestUri = string.Format(@"http://{0}/api/VerifyMyModel/", MyServer);

using (var c = new HttpClient())
{
var response = await c.PostAsJsonAsync(requestUri, json);
}
...
}

var 响应 包含错误消息响应 500。

我也试过使用查询字符串:

public string GetQueryString(object obj)
{
var properties = from p in obj.GetType().GetProperties()
where p.GetValue(obj, null) != null
select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString());

return String.Join("&", properties.ToArray());
}

[HttpPost]
public async Task<MyResponse> VerifyAsync(MyModel model)
{
var MyServer = ConfigurationManager.AppSettings["MyServer"];
string queryString = GetQueryString(model);
var requestUri = string.Format(@"http://{0}/api/VerifyMyModel/?{1}", MyServer, queryString);

using (var c = new HttpClient()){
var response = await c.GetAsync(requestUri); // API Also has GET methods
}
}

但是 querystring 方法返回一个 405 method not allowed 响应。

MyModel 是包含公共(public)模型的共享类库的一部分,并且包含在两个应用程序中。

有没有更好的方法将整个模型发布到远程 api 操作?

谢谢。

*编辑

API的RouteConfig:

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

我将以下内容添加到 API 的 MVC 站点的 HomeController 中进行测试,我收到了预期的结果,没有错误:

public async Task<ActionResult> TestVerifyMyModel(MyModel model)
{
var api = new VerifyMyModelController();
var res = await api.PostAsync(model);

return Json(res, JsonRequestBehavior.AllowGet);
}

所以我知道 Controller 的 PostAsync Action 有效。我只是无法在远程调用时让它工作。

我还在服务器上启用了 Failed Request Tracing 并且有 uploaded the generated XML file .这对我来说没有任何意义,但我认为它可能有所帮助。

最佳答案

发布的路由配置看起来更像是您的 MVC 路由配置,而不是 Web Api 路由配置。但如果它是 Web Api 配置,那么你不应该将 ActionName 添加到你的 url。

[HttpPost]
public async Task<MyResponse> VerifyAsync(MyModel model)
{
var MyServer = ConfigurationManager.AppSettings["MyServer"];
var json = Newtonsoft.Json.JsonConvert.SerializeObject(model);

var requestUri = string.Format(@"http://{0}/api/VerifyMyModel/PostAsync", MyServer);

using (var c = new HttpClient())
{
var response = await c.PostAsJsonAsync(requestUri, json);
}
...
}

更新:从 HttpClient 响应中检索模型的示例代码

using (var client = new HttpClient())
{
client.BaseAddress = new Uri(ConfigurationManager.AppSettings["MyServer"]);

client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = await client.GetAsync("api/VerifyMyModel/PostAsync");
if (response.IsSuccessStatusCode)
{
var myResponseModel = await response.Content.ReadAsAsync<MyResponseModel>();
}
}

关于c# - MVC Controller 将整个模型发布到远程 api 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34644990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com