网络中托管的WCF服务消耗的TimeoutException引发

时间:2019-06-07 08:35:41

标签: c# wcf .net-core

我正在编写一个Web应用程序,该应用程序将在Raspberry PI上的Electron中托管。 Raspberry PI附带了一个指纹扫描仪,该指纹扫描仪返回一个字符串,我需要检查该指纹是否已在另一台服务器的数据库中注册。我是通过调用网络上托管的WCF服务方法来实现的。
现在的问题是,在调用WCF服务时,我在1分钟(默认超时)后收到超时,但是当我在本地计算机上运行应用程序时,它可以工作。

服务代码:

[ServiceContract(Namespace = "http://192.168.0.154:8733/GlauxSoft.SnackBox.WebService/")]
public interface IService
{
        [OperationContract]
        Fingerprint GetFingerprintByUniqueId(string uniqueId);
}

public class Service : IService
{
    public Fingerprint GetFingerprintByUniqueId(string uniqueId)
    {
        // This is just a DataBase call, nothing extraordinarily expensive
        using (EvidenceSessionHelper.CreateDefaultWebServiceSession())
        {
            return Fingerprint.MapAuthentifizierungToWebServiceFingerprint(QueryAuthentifizierung.GetFingerprintByUniqueId(uniqueId));
        }
    }
}

消费者代码:

[ServiceContract(Namespace = "http://192.168.0.154:8733/GlauxSoft.SnackBox.WebService/", ConfigurationName = "ISnackBoxService")]
public interface ISnackBoxService
{
    [OperationContract(
        Action ="http://192.168.0.154:8733/GlauxSoft.SnackBox.WebService/IService/GetFingerprintByUniqueId", 
        ReplyAction = "http://192.168.0.154:8733/GlauxSoft.SnackBox.WebService/IService/GetFingerprintByUniqueIdResponse")]
    Fingerprint GetFingerprintByUniqueId(string uniqueId);
}

public class ServiceClient : ClientBase<IService>, IService
{
    public SnackBoxServiceClient() : 
            base(GetDefaultBinding(), GetDefaultEndpointAddress())
    {
        Endpoint.Name = EndpointConfiguration.BasicHttpBinding_ISnackBoxService.ToString();
    }

    public enum EndpointConfiguration
    {
        BasicHttpBinding_ISnackBoxService
    }

    public Fingerprint GetFingerprintByUniqueId(string uniqueId)
    {
        return Channel.GetFingerprintByUniqueId(uniqueId);
    }
}

使用者是用.NET Core 3 Preview 5编写的ASP.NET Razor应用程序

我正在这样调用Consumer代码:

var service = new ServiceClient();
var evdFingerprint = service.GetFingerprintByUniqueId("Test String"); // <-- Runs for 1 minute and throws the TimeoutException

这是堆栈跟踪:

  

System.TimeoutException:请求通道超时,尝试在00:01:00之后发送。增加传递给请求的调用的超时值,或者增加绑定上的SendTimeout值。分配给该操作的时间可能是较长超时的一部分。 ---> System.TimeoutException:对“ http://192.168.0.154:8733/GlauxSoft.SnackBox.WebService/”的HTTP请求已超过分配的超时时间00:01:00。分配给该操作的时间可能是较长超时的一部分。      在System.ServiceModel.Channels.HttpChannelFactory`1.HttpClientRequestChannel.HttpClientChannelAsyncRequest.SendRequestAsync(消息,TimeoutHelper timeoutHelper)      在System.ServiceModel.Channels.RequestChannel.RequestAsync(消息,TimeSpan超时)处

编辑:我已经做了一些进一步的测试,好像发给本地计算机的任何HTTP请求都没有通过wget 192.168.0.154:5106 -o index.html,因此用wireshark监视我的网络流量也不会向我显示对我的电脑的任何GET请求,并且也不会进入https://192.168.0.154:5106
但是,我可以对本地PC进行ping操作,甚至可以通过SSH进入Raspberry PI,也可以与Raspberry PI建立VNC远程桌面会话。

3 个答案:

答案 0 :(得分:0)

您可以通过多种方式在绑定中配置超时。在代码中,

    WSHttpBinding binding = new WSHttpBinding();
    binding.OpenTimeout = new TimeSpan(0, 10, 0);
    binding.CloseTimeout = new TimeSpan(0, 10, 0);
    binding.SendTimeout = new TimeSpan(0, 10, 0);
    binding.ReceiveTimeout = new TimeSpan(0, 10, 0);

或在web.config中

<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding openTimeout="00:10:00" 
                 closeTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 receiveTimeout="00:10:00">
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

答案 1 :(得分:0)

  

GetDefaultBinding(),GetDefaultEndpointAddress()

我希望您可以与我分享与上述方法主体相关的更多细节。
默认绑定的ClientCredentailType是什么?因为某些绑定与Core(WS- *绑定)不太兼容。另外,当您从另一台计算机调用服务时,是否在客户端修改了服务端点地址?
我认为,我们可以使用Microsoft WCF Web服务引用提供程序工具来生成客户端代理,然后修改服务端点地址并根据服务器端的绑定配置显式提供客户端凭据。
随时让我知道问题是否仍然存在。

答案 2 :(得分:0)

此修复非常简单,我需要使用HTTPS,因此无需连接到http://192.168.0.154:8733/... 我需要连接到https://192.168.0.154:8733/...