【发布时间】:2016-04-11 05:50:57
【问题描述】:
我想从我的前端 MVC 站点调用一个 API。这两个应用程序在同一网络上的不同服务器上运行。
API 控制器的功能类似于:
[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 站点有一个用户填写的表单,这些数据被发布到本地控制器,我想转发到 API。公众无法访问 API 应用程序,因此我无法使用 AJAX 等直接发布到它。它必须来自站点控制器。
我尝试了以下方法,但得到了500 internal server error 作为回复
[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 response 包含错误消息响应 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 是共享类库的一部分,其中包含通用模型,并且包含在两个应用程序中。
有没有更好的方法将整个模型发布到远程 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);
}
所以我知道控制器的PostAsync 操作有效.. 远程调用时我无法让它工作。
我还在服务器上启用了Failed Request Tracing 并拥有uploaded the generated XML file。这对我来说没有任何意义,但认为它可能会有所帮助。
【问题讨论】:
-
显示远程web api的路由配置
-
您提到它是一个远程 Web API,它是否托管在同一个域上?如果没有,则必须启用跨站点请求(如果您尚未启用)
-
我已经添加了API的RouteConfig。 API Server 在同一个域上,使用
http://ServerName/IISSiteName访问我添加了一个AllowCrossSiteJsonAttribute,这是我通过google 找到的。
标签: c# asp.net-mvc api post