【问题标题】:Make POST with POCO in body?在正文中使用 POCO 进行 POST?
【发布时间】:2016-05-17 14:42:12
【问题描述】:

我有一个实体框架对象(代码优先),所以它本质上是一个 POCO。我想把它通过网络传递给 WebAPI 服务(WebAPI 是 MVC)。

  • 我需要调用的目标 .net 框架是 4.0 (aspx),无法更改。
  • 捕获调用的 WebAPI 是 4.5.1,是最新的 MVC 和 EF 版本,但它是跨网络的,因此没有版本冲突。
  • 包含我要传输的对象的 EF 类项目也是 4.5.1,但我没有遇到任何问题(在 aspx 项目中使用过它,奇迹般地,它可以正常工作)。
  • 调用所有 EF 方法和 DBContext 调用在嵌入到 4.0 项目中时可以完美运行,因此这也不是问题(我们希望通过 Web 服务来实现,而不是直接 EF 调用)。
  • EF 代码优先模型仅用作 POCO。例如,我们使用一个(EF_Obj 的)List 来绑定到 DataGrids,所以同样没有版本冲突。

我设法使用以下方法进行了简单的 GET 调用:

Using client = New WebClient()
    responseString = client.DownloadString(String.Format("http://localhost:1234/MyURLGet/{0}", txtValue.Text.Trim()))
    myPOCO_Class = Newtonsoft.Json.JsonConvert.DeserializeObject(Of MyPOCO_EF_obj)(responseString)
End Using

这很好用。当我想插入数据库时​​,问题是试图将MyPOCO_EF_Obj 附加到 POST 的主体。

到目前为止,我发现的是这个,但它不允许我附加 POCO 类,只能附加字符串:

 Using client = New WebClient()
    'assemble the data
    Dim values As New NameValueCollection
    values("value") = txtValue.Text.Trim()
    values("description") = txtDescription.Text.Trim()

    Dim response = client.UploadValues("http://localhost:1234/MyURLPOST/{0}", userName), values)
    retVal = Encoding.[Default].GetString(response)
End Using

这段代码的问题在于,当它到达另一边时,values 被捕获,但没有任何数据随之而来。

   public string Post(string username, [FromBody] System.Collections.Specialized.NameValueCollection values) { //etc }

我更愿意将 POCO 对象扔掉并在那里处理它,但发送名称/值对也可以。

也就是说:

  1. 是否可以使用 POCO [FromBody] 执行此操作?如果有,怎么做?

  2. 为什么我的值没有传递给 POST 处理程序?

编辑:作为参考,我目前正在查看这个 SO 问题和回复:

HTTP request with post

【问题讨论】:

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


    【解决方案1】:

    正如链接中提到的,有很多方法可以做到这一点,但是添加了如何使用 restSharp。使用nuget安装restsharp,创建一个简单的类如下

    public class SampleRestClient
    {
        private readonly RestClient _client;        
    
        private readonly string _url = "http://xyz/"; //URL of the API  
    
        public IRestResponse Submit(SAmpleViewModel model)
        {
            _client = new RestClient(_url);
            var request = new RestRequest("api/Submit", Method.POST) { RequestFormat = DataFormat.Json };
    
            request.AddBody(model);
    
            var response = _client.Execute(request);
            return response;
        }
    }       
    

    现在您可以在任何需要的地方调用 Submit 方法。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多