我有一个安装了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
答案 0 :(得分:0)
根据您提供的代码,当第1位处理标头时,似乎会读取InputStream
的所有数据,因为BufferSize
大于内容大小,实际上{您的代码中的{1}}是完整的请求内容。因此,当您尝试读取最终header2
中的正文内容时,它无法读取任何数据,并且会被阻止超时。
您可以在GitHub中参考IotWeb或其他回购。 IotWeb提供了一个支持WebSocket的简单HTTP服务器。