关于C#:如何在ASP.NET Web API中接收JSON?

How to receive json in ASP.NET web api?

我有一家外部公司将数据推送到我们的服务器之一,他们将发送JSON数据。 我需要创建一个POST api来接收它。 这就是我到目前为止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[System.Web.Http.HttpPost]
[System.Web.Http.ActionName("sensor")]
public void PushSensorData(String json)
{
    string lines = null;
    try
    {
          System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\\\test.txt");
          file.WriteLine(json);
          file.Close();
          //JSONUtilities.deserialize(json);
    }
    catch (Exception ex)
    {
        MobileUtilities.DoLog(ex.StackTrace);
    }
}

我通过使用提琴手发送json数据来测试它,但是json为null。
这是来自提琴手的原始数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
POST http://localhost:31329/mobileapi/pushsensordata/ HTTP/1.1
User-Agent: Fiddler
Host: localhost:31329
Content-Type: application/json
Content-Length: 533

{
"id": {
   "server":"0.test-server.mobi",
   "application":"test-server.mobi",
   "message":"00007-000e-4a00b-82000-0000000",
   "asset":"asset-0000",
   "device":"device-0000"
},
"target": {
   "application":"com.mobi"
},
"type":"STATUS",
"timestamp": {
   "asset": 0000000
   "device": 00000000,
   "gateway": 000000,
   "axon_received_at": 00000,
   "wits_processed_at": 000000
},
"data_format":"asset",
"data":"asset unavailable"
}


在Web API中,您可以让框架为您完成大部分繁琐的序列化工作。首先将您的方法修改为:

1
2
3
4
5
6
7
8
9
[HttpPost]
public void PushSensorData(SensorData data)
{
    // data and its properties should be populated, ready for processing
    // its unnecessary to deserialize the string yourself.
    // assuming data isn't null, you can access the data by dereferencing properties:
    Debug.WriteLine(data.Type);
    Debug.WriteLine(data.Id);
}

创建一个类。为了帮助您入门:

1
2
3
4
5
6
7
8
9
10
public class SensorData
{
    public SensorDataId Id { get; set; }
    public string Type { get;set; }
}

public class SensorDataId
{
    public string Server { get; set; }
}

此类的属性需要镜像JSON的结构。我将它留给您完成向模型中添加属性和其他类的步骤,但是按照编写的方式,该模型应该可以工作。与模型不对应的JSON值应丢弃。

现在,当您调用Web API方法时,传感器数据将已经反序列化。

有关更多信息,请参见http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api


您的Web API模型必须与javascript请求对象相同

例如,

1
2
3
4
5
6
7
8
public class SomeRequest
    {

        public string data1{ get; set; }
        public string data2{ get; set; }
        public string data13{ get; set; }

    }

在Javascript中,您的请求对象和javascript调用应如下所示

1
2
3
4
5
6
 var requestObj = {
               "data1": data1,
               "data2": data2,
               "data3": data3,

            };

并在javascript中发布url和requestObj

像这样在Web API中进行访问

1
2
3
4
5
  public void PushSensorData(SomeRequest objectRequest)
        {
objectRequest.data1
objectRequest.data2
objectRequest.data3

在将JSON.stringify(yourObject)(这是Javascript,但任何一种语言都具有这种实用程序)之前,都尝试过了吗?

我还可以指出您的评论吗,因为您无法执行POST,因此您正在使用GET方法?您应该在计划中谨慎,因为GET方法只能占用太多空间:如果对象变大,则将被迫使用POST,因此建议您立即采用这种方法。