NetCore gRPC 客户端调用出错

报错:

Status(StatusCode="Internal", Detail="Error starting gRPC call. HttpRequestException: An error occurred while sending the request. IOException: The response ended prematurely.", DebugException="System.Net.Http.HttpRequestException: An error occurred while sending the request.
 ---> System.IO.IOException: The response ended prematurely.
   at System.Net.Http.HttpConnection.FillAsync()
   at System.Net.Http.HttpConnection.ReadNextResponseHeaderLineAsync(Boolean foldedHeadersAllowed)
   at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection connection, HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Grpc.Net.Client.Internal.GrpcCall`2.RunCall(HttpRequestMessage request, Nullable`1 timeout)")

解决办法:

新增代码片段:

 AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

 AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);//新增,解决报错
 var channel = GrpcChannel.ForAddress("http://localhost:5001");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在.NET Core中,可以使用MQTTnet库来实现MQTT客户端的订阅功能。下面是一个简单的示例: 首先,安装MQTTnet库。可以通过NuGet包管理器控制台或者通过Visual Studio的NuGet包管理器来安装。 接下来,在代码中引入MQTTnet命名空间: ```csharp using MQTTnet; using MQTTnet.Client; ``` 然后,创建一个MQTT客户端: ```csharp var options = new MqttClientOptionsBuilder() .WithTcpServer("broker.hivemq.com", 1883) .Build(); var factory = new MqttFactory(); var client = factory.CreateMqttClient(); await client.ConnectAsync(options); ``` 在上述代码中,我们使用的是HiveMQ公共的MQTT broker,当然你也可以使用其他的MQTT broker。 接下来,订阅某个主题: ```csharp await client.SubscribeAsync(new List<TopicFilter> { new TopicFilterBuilder().WithTopic("mytopic").Build() }); ``` 在上面的代码中,我们订阅了一个名为"mytopic"的主题。 最后,我们可以设置订阅消息的回调函数,来处理接收到的消息: ```csharp client.UseApplicationMessageReceivedHandler(e => { Console.WriteLine($"Received message: {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}"); }); ``` 在上述代码中,我们将接收到的消息打印出来,你也可以根据自己的需求进行处理。 完整的代码示例如下: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MQTTnet; using MQTTnet.Client; using MQTTnet.Client.Options; namespace MqttSubscriber { class Program { static async Task Main(string[] args) { var options = new MqttClientOptionsBuilder() .WithTcpServer("broker.hivemq.com", 1883) .Build(); var factory = new MqttFactory(); var client = factory.CreateMqttClient(); await client.ConnectAsync(options); await client.SubscribeAsync(new List<TopicFilter> { new TopicFilterBuilder().WithTopic("mytopic").Build() }); client.UseApplicationMessageReceivedHandler(e => { Console.WriteLine($"Received message: {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}"); }); Console.ReadLine(); } } } ``` 这样就完成了一个简单的.NET Core MQTT客户端的订阅功能。你可以根据自己的需求对代码进行修改和扩展。 ### 回答2: 在.NET Core中,可以使用MqttNet库实现MQTT客户端的订阅功能。 首先,需要在项目中导入MqttNet库的命名空间,例如: ``` using MQTTnet; using MQTTnet.Client; using MQTTnet.Client.Options; using MQTTnet.Client.Subscribing; ``` 接下来,可以创建一个MQTT客户端实例,并设置订阅主题: ``` var factory = new MqttFactory(); var client = factory.CreateMqttClient(); var options = new MqttClientOptionsBuilder() .WithTcpServer("broker.hivemq.com", 1883) // 设置MQTT代理服务器的地址和端口号 .WithClientId("mqttClient") // 设置客户端ID .Build(); await client.ConnectAsync(options); // 连接MQTT代理服务器 var topics = new MqttTopicFilterBuilder() .WithTopic("topic/test") // 设置订阅的主题 .Build(); await client.SubscribeAsync(topics); // 订阅主题 ``` 在订阅成功后,可以通过订阅客户端的事件来接收到消息: ``` client.UseApplicationMessageReceivedHandler(e => { var payload = e.ApplicationMessage.Payload; // 获取消息的有效载荷 var message = Encoding.UTF8.GetString(payload); // 将有效载荷转化为字符串 Console.WriteLine($"Received message: {message}"); }); ``` 当接收到消息时,可以在事件处理程序中进行相应的逻辑处理。 最后,可以在程序需要结束时取消订阅并断开与MQTT代理服务器的连接: ``` await client.UnsubscribeAsync("topic/test"); // 取消订阅 await client.DisconnectAsync(); // 断开连接 ``` 通过以上步骤,就可以在.NET Core中实现MQTT客户端的订阅功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值