C# MVC控制器将整个模型发布到远程api操作

C# MVC控制器将整个模型发布到远程api操作,c#,asp.net-mvc,api,post,C#,Asp.net Mvc,Api,Post,我想从我的前端MVC站点调用一个API。这两个应用程序在同一网络上的不同服务器上运行 API控制器的功能类似于: [AllowCrossSiteJson] public class VerifyMyModelController : ApiController { [HttpPost] public MyResponse Post(MyModel model) { return MyHelper.VerifyMyModel(model); }

我想从我的前端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
}
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
    }
}
我将以下内容添加到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);
}

公共异步任务。它对我来说没有任何意义,但我认为它可能会有所帮助。

发布的路由配置看起来更像您的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);
        }
        ...
    }
[HttpPost]
公共异步任务VerifySync(MyModel模型)
{
var MyServer=ConfigurationManager.AppSettings[“MyServer”];
var json=Newtonsoft.json.JsonConvert.SerializeObject(模型);
var requestUri=string.Format(@“http://{0}/api/VerifyMyModel/PostAsync”,MyServer);
使用(var c=newhttpclient())
{
var response=wait 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>();
    }
}
使用(var-client=new-HttpClient())
{
client.BaseAddress=新Uri(ConfigurationManager.AppSettings[“MyServer”]);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage response=wait client.GetAsync(“api/VerifyMyModel/PostAsync”);
if(响应。IsSuccessStatusCode)
{
var myResponseModel=wait response.Content.ReadAsAsync();
}
}

显示远程web API的路由配置您提到它是一个远程web API,它是否托管在同一个域上?如果没有,您必须启用跨站点请求,如果您没有,我已经添加了API的RouteConfig。API服务器位于同一个域上,使用
http://ServerName/IISSiteName
我添加了一个通过谷歌找到的
AllowCrossSiteJsonAttribute
。感谢您的回复。路由配置是VS创建的默认配置,我确信我选择了MVC API解决方案。。我更新了我的代码以匹配您的答案,但是我的
响应
500内部服务器错误:发生了一个错误。
我们的elmah日志中没有记录任何内容,因此我无法找出原因。我为原始问题添加了一个额外的测试,API在调用自身时工作,似乎不是从其他地方来的。可能会有一些混乱。当您创建ASP.net MVC模板+Web API时,您应该获得2个配置文件:RouteConfig.cs(MVC)WebApiConfig.cs(Web API)。您应该有两种类型的控制器MVC和API。所以你可能需要重新检查哪个调用哪个。啊,我确实有那两个文件。控制器中的差异是它继承的吗<代码>:控制器
vs
:ApiController
?谢谢你的帮助。最后一件事,
response
中现在有状态代码
200
。如何使其具有
MyResponse
对象?这就是API调用应该返回的内容。。ThanksI使用示例代码更新了答案,以检索模型对象(假设您将其添加到api调用中的响应中)。希望有帮助!
[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);
        }
        ...
    }
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>();
    }
}