从MVC4站点向另一个站点发送命令

时间:2013-11-24 22:19:22

标签: asp.net-mvc-4 asp.net-web-api controller

我有两个站点:其中一个控制另一个站点通过Web API发送一些命令。这个想法是:控制器站点的操作将命令发送到另一个站点,获取响应并执行一些业务规则,而不重定向到另一个站点。

我有大量示例解释如何通过jQuery实现这一点,但我想让控制器将数据发布到其他站点,而不是视图。

我在这个答案找到了一个方法:How to use System.Net.HttpClient to post a complex type?,但我想要一个JSON方法的答案。

有人可以使用JSON发布一个简单示例,说明如何执行此操作吗?

1 个答案:

答案 0 :(得分:0)

由于我没有找到对我的问题的简短回答,我将发布我已经提出的解决方案。

由于该方法使用需要HttpClient语句的async方法,因此执行以下操作重新调整Task<ActionResult>。另一个修改是如果您在上下文中保存对象。

而不是使用:

context.SaveChanges();

你必须使用:

await context.SaveChangesAsync();

下面的代码实现了ASP.NET MVC4控制器的Action:

[HttpPost]
public async Task<ActionResult> Create(MyModel model)
{
    if (ModelState.IsValid)
    {
        // Logic to save the model.
        // I usually reload saved data using something kind of the statement below:

        var inserted = context.MyModels
            .AsNoTracking()
            .Where(m => m.SomeCondition == someVariable)
            .SingleOrDefault();

        // Send Command.
        // APIMyModel is a simple class with public properties.
        var apiModel = new APIMyModel();

        apiModel.AProperty = inserted.AProperty;
        apiModel.AnotherProperty = inserted.AnotherProperty;

        DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(APIMyModel));

        // use the serializer to write the object to a MemoryStream 
        MemoryStream ms = new MemoryStream();
        jsonSer.WriteObject(ms, apiModel);
        ms.Position = 0;

        //use a Stream reader to construct the StringContent (Json) 
        StreamReader sr = new StreamReader(ms);
        // Note if the JSON is simple enough you could ignore the 5 lines above that do the serialization and construct it yourself 
        // then pass it as the first argument to the StringContent constructor 
        StringContent theContent = new StringContent(sr.ReadToEnd(), System.Text.Encoding.UTF8, "application/json"); 

        HttpClient aClient = new HttpClient();
        Uri theUri = new Uri("http://yoursite/api/TheAPIAction");
        HttpResponseMessage aResponse = await aClient.PostAsync(theUri, theContent);

        if (aResponse.IsSuccessStatusCode)
        {
            // Success Logic. Yay!
        }
        else
        {
            // show the response status code 
            String failureMsg = "HTTP Status: " + aResponse.StatusCode.ToString() + " - Reason: " + aResponse.ReasonPhrase;
        } 

        return RedirectToAction("Index");  
    }

    // if Model is not valid, you can put your logic to reload ViewBag properties here.
}