我是一名有用的助手,我可以为您翻译文本。
我将以下内容添加到API的MVC站点的
我希望你能够从我的前端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内部服务器错误
作为响应。
[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方法不允许
的响应。
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
,并上传了生成的XML文件。虽然对我来说没有什么意义,但我认为这可能会有所帮助。
http://ServerName/IISSiteName
进行访问。我添加了一个通过谷歌找到的AllowCrossSiteJsonAttribute
。 - Jake