TimeoutException выбрасывает использование службы WCF, размещенной в сети - PullRequest
0 голосов
/ 07 июня 2019

Я пишу веб-приложение, которое будет размещено в Electron на Raspberry PI. 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);
    }
}

Потребитель - приложение ASP.NET Razor, написанное в .NET Core 3 Preview 5

.

И я вызываю код потребителя так:

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

Вот трассировка стека:

System.TimeoutException: истекло время ожидания канала запроса при попытке отправки после 00:01:00. Увеличьте значение тайм-аута, передаваемое вызову Request, или увеличьте значение SendTimeout в Binding. Время, отведенное для этой операции, могло быть частью более длительного времени ожидания. ---> System.TimeoutException: HTTP-запрос к 'http://192.168.0.154:8733/GlauxSoft.SnackBox.WebService/' превысил установленное время ожидания 00:01:00. Время, отведенное для этой операции, могло быть частью более длительного времени ожидания. at 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 раз.
Тем не менее, я могу пропинговать свой локальный компьютер, и я даже могу использовать SSH в Raspberry PI, и я также могу установить сеанс удаленного рабочего стола VNC с моим Raspberry PI

.

Ответы [ 3 ]

0 голосов
/ 10 июня 2019

GetDefaultBinding (), GetDefaultEndpointAddress ()

Я хотел бы, чтобы вы могли поделиться со мной более подробной информацией, связанной с указанным выше телом метода.
Что такое ClientCredentailType привязки по умолчанию?поскольку некоторые привязки плохо совместимы с Core (привязка WS- *).Кроме того, изменили ли вы адрес конечной точки службы на стороне клиента при вызове службы с другого компьютера?
По моему мнению, мы могли бы использовать инструмент поставщика ссылок на веб-службы Microsoft WCF, чтобы сгенерировать прокси клиента, а затем изменить службуадрес конечной точки и укажите учетные данные клиента в зависимости от конфигурации привязки на стороне сервера.
Не стесняйтесь сообщить мне, если проблема все еще существует.

0 голосов
/ 18 июня 2019

Исправление было достаточно простым, мне нужно было использовать HTTPS, поэтому вместо подключения к http://192.168.0.154:8733/... мне нужно было подключиться к https://192.168.0.154:8733/...

0 голосов
/ 07 июня 2019

Вы можете настроить время ожидания для привязки разными способами. В коде

    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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...