Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET web api中接收json?_C#_Asp.net_Json_Asp.net Web Api - Fatal编程技术网

C# 如何在ASP.NET web api中接收json?

C# 如何在ASP.NET web api中接收json?,c#,asp.net,json,asp.net-web-api,C#,Asp.net,Json,Asp.net Web Api,我有一家外部公司将数据推送到我们的一台服务器,他们将发送JSON数据。我需要创建一个POST api来接收它。这就是我目前所拥有的 [System.Web.Http.HttpPost] [System.Web.Http.ActionName("sensor")] public void PushSensorData(String json) { string lines = null; try { System.IO.StreamWriter file

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

[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);
    }
}
我通过使用fiddler发送json数据来测试它,但是json是空的。 这是来自fiddler的原始数据

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"
}

在将JSON.stringify(您的对象)(这是Javascript,但任何语言都有这种实用程序)传递到web api之前,您是否尝试过它


我也可以指出你之前的评论,说你正在使用GET方法,因为你不能让POST工作吗?您应该在规划时小心,因为GET方法只会占用这么多空间:如果对象变大,您将被迫使用POST,因此我建议您立即采用这种方法。

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

[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);
}
创建一个类。要开始,请执行以下操作:

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方法时,传感器数据将被反序列化


有关更多信息,请参见

您的Web API模型需要与javascript请求对象相同

比如说,

public class SomeRequest
    {

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

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

 var requestObj = {
                "data1": data1,
                "data2": data2,
                "data3": data3,

            };
  public void PushSensorData(SomeRequest objectRequest)
        {
objectRequest.data1
objectRequest.data2
objectRequest.data3
并在javascript中发布url和requestObj

Web API中的访问

 var requestObj = {
                "data1": data1,
                "data2": data2,
                "data3": data3,

            };
  public void PushSensorData(SomeRequest objectRequest)
        {
objectRequest.data1
objectRequest.data2
objectRequest.data3

你用
HttpGet
修饰了你的方法,但是想要一篇文章吗?我的错是,我试图用GET做些什么,因为我无法让文章工作。这不是你请求中的字符串,它是一个对象。web api知道如何将您的对象序列化为c#对象,只需尝试创建一个对象并将其作为您的参数。重复问题:我正在尝试使用fiddler测试该程序,因为我不知道其他公司正在使用什么。我正在请求正文中传递json。您尝试过json以外的东西吗,比如简单的字符串?如果可行,请尝试将JSON作为简单字符串而不是JSON对象传递。如果您在web api中接受一个字符串,那么在这里没有结果是很正常的。作为测试,您可以将数据类型从string更改为dynamic,看看接下来会发生什么。
JSON.stringify
是不相关的,因为JSON@hbulens接收到的已经是格式良好的JSON。我想您并没有通读我的答案。对于格式正确的参数,ASP.NET Web API特别敏感。我已经多次遇到这个问题,而且字符串化json对象几乎每次都能正常工作。注意,我删除了
[ActionName]
属性。它对你没有多大帮助。有关更多信息,请参阅。因此,我创建了SensorData类。如何访问api方法中的数据?是否需要执行此SensorReading sr=新建SensorReading();并使用getters访问
数据
参数应为
传感器数据
对象。您可以通过取消引用数据的属性来访问数据。我将更新我的答案来帮助说明这一点。我鼓励您使用一个简单的模型和相应的简单JSON来尝试这一点。习惯Web API的工作方式,然后在复杂性中扩展模型。即使字段名温度发生变化,是否有方法获取数据中的值“data”:{“temperature”:“37C”}