如何在windows iot中阅读内容正文

时间:2018-06-18 10:58:19

标签: c# sockets windows-iot-core-10

我有一个安装了Windows Iot的Raspberry Pi3。

我在c#中编写了一个后台应用程序来处理来自桌面应用程序的rest api调用。

我当然可以调用我的服务器api调用。

我遇到的问题是我试图从客户电话中读取正文的内容。

我发布了JSON。

这是我的客户电话:

public static async Task<Address> RelayGetCustomerAddress< T >(
    string uriController,
    T jsonObject)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = Uri;
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var jsonInput = JsonConvert.SerializeObject(jsonObject);
        var contentPost = new StringContent(jsonInput, Encoding.UTF8, "application/json");
        var response = client.PostAsync(uriController, contentPost).Result;
        var data = response;
        data.EnsureSuccessStatusCode();
        var json = await data.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<Address>(json);
    }
}

这是我在Raspberry Pi上的代码。 第1位处理我解析的标题没有问题:

var client = new List<string>();
var header2 = new StringBuilder();

using (var input = args.Socket.InputStream)
{
    byte[] data = new byte[BufferSize];
    IBuffer buffer = data.AsBuffer();
    uint dataRead = BufferSize;
    while (dataRead == BufferSize)
    {
        await input.ReadAsync(buffer, BufferSize, InputStreamOptions.Partial);
        header2.AppendLine(Encoding.UTF8.GetString(data, 0, data.Length));
        dataRead = buffer.Length;
    }

var requestLines = header2.ToString().Split(new[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
var api = requestLines[0].Split(' ')[1].Split('/');
client.Add(api[2]); //controller
client.Add(api[3]);//action

此位获取内容长度:

var contentLength2 = requestLines.FirstOrDefault(d => d.StartsWith("Content-Length:", StringComparison.CurrentCultureIgnoreCase));
uint contentLength = 0;
if (!string.IsNullOrEmpty(contentLength2))
{
    contentLength = (uint)int.Parse(Regex.Match((contentLength2), @"\d+").Value);
}

最后这个位试图读取正文内容:

if ( contentLength > 0 )
{
    dataRead = BufferSize;
    while ( dataRead == BufferSize )
    {
        await input.ReadAsync( buffer, BufferSize, InputStreamOptions.Partial );
        var content = Encoding.UTF8.GetString( data, 0, ( int ) contentLength );
        client.Add( content );
        dataRead = buffer.Length;
    }
}
else
{
    LogVerbose( "Empty JSON Body" );
    client.Add( string.Empty );
}
}

我称之为api两次。

第一次我可以获得身体内容,第二次它只是挂起:

await input.ReadAsync( buffer, BufferSize, InputStreamOptions.Partial 

1 个答案:

答案 0 :(得分:0)

根据您提供的代码,当第1位处理标头时,似乎会读取InputStream的所有数据,因为BufferSize大于内容大小,实际上{您的代码中的{1}}是完整的请求内容。因此,当您尝试读取最终header2中的正文内容时,它无法读取任何数据,并且会被阻止超时。

您可以在GitHub中参考IotWeb或其他回购。 IotWeb提供了一个支持WebSocket的简单HTTP服务器。