CommunicationException происходит через одну минуту (во время звонка в службу wcf из приложения windows phone 8)

Я реализовал следующий сервис WCF:

namespace TeaService
{
    public class TeaService : ITeaService
    {
        public string PrepareTea(string tea)
        {
            System.Threading.Thread.Sleep(61000);
            return "A nice cup of " + tea + " tea will be ready in a few minutes.";
        }
    }
}

Служба использует привязку по умолчанию basichttpbinding, а конфигурация привязки настраивается следующим образом:

<bindings>
  <basicHttpBinding>
    <binding openTimeout="00:05:00" receiveTimeout="00:05:00" sendTimeout="00:05:00" closeTimeout="00:05:00"></binding>
  </basicHttpBinding>
</bindings>

То есть все значения времени ожидания установлены на пять минут.

Клиентское приложение Windows Phone 8 вызывает службу:

namespace TeaClient
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();

            var client = new TeaServiceClient();
            client.PrepareTeaCompleted += Client_PrepareTeaCompleted;
            client.PrepareTeaAsync("Rooibos");
        }

        private void Client_PrepareTeaCompleted(object sender, PrepareTeaCompletedEventArgs e)
        {
            tb.Text = e.Result;
        }
    }
}

"Tb" - это текстовое поле, определенное в представлении xaml.

В ServicesReferences.ClientConfig значения времени ожидания для basicHttpBinding установлены следующим образом:

<bindings>
    <basicHttpBinding>
        <binding name="BasicHttpBinding_ITeaService" maxBufferSize="2147483647"
            maxReceivedMessageSize="2147483647" openTimeout="00:05:00" receiveTimeout="00:05:00" sendTimeout="00:05:00" closeTimeout="00:05:00">
            <security mode="None" />
        </binding>
    </basicHttpBinding>
</bindings>

Проблема: через одну минуту CommunicationException выбрасывается на стороне клиента.

$exception  {System.ServiceModel.CommunicationException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.
   at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
   at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.<EndGetResponse>b__d(Object sendState)
   at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState)
   --- End of inner exception stack trace ---
   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
   at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
   --- End of inner exception stack trace ---
   at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at TeaClient.TeaService.TeaServiceClient.TeaServiceClientChannel.EndPrepareTea(IAsyncResult result)
   at TeaClient.TeaService.TeaServiceClient.TeaClient.TeaService.ITeaService.EndPrepareTea(IAsyncResult result)
   at TeaClient.TeaService.TeaServiceClient.OnEndPrepareTea(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)}   System.Exception {System.ServiceModel.CommunicationException}

Я не могу понять, почему это так. Если я реализую точно такой же код, специфичный для клиента WCF, в настольном приложении WPF, исключение не будет выдано. Я могу подтвердить, что служба работает нормально, и приложение Windows Phone работает нормально, пока я удаляю Thread.Sleep(61000). В моем "реальном" производственном сценарии (который отражает этот упрощенный пример) клиент должен иметь возможность ждать дольше одной минуты, не вызывая исключение CommunicationException. Поскольку пример работает, если я делаю то же самое из приложения WPF, я подозреваю, что проблема связана с ограничением на платформе Windows Phone. Но я не могу найти информацию о том, что звонки WCF на Windows Phone не могут занимать более одной минуты.

Кроме того, я попытался установить OperationTimeout на прокси клиента следующим образом:

client.InnerChannel.OperationTimeout = TimeSpan.FromMinutes(5.0);

Но без удачи. Любые предложения приветствуются.

РЕДАКТИРОВАТЬ: Двойной вопрос, отмеченный nvoigt, относится к HttpClient. Этот вопрос касается клиентского прокси WCF, использующего BasicHttpBinding. Основная проблема, без сомнения, точно такая же, и поэтому мы пришли к выводу, что это ограничение платформы.

1 ответ

Приложения Windows Phone не имеют файла app.config, поэтому ни один из указанных таймаутов не будет применяться. Вместо этого вам нужно установить его на клиентском экземпляре следующим образом:

var client = new TeaServiceClient();
client.ChannelFactory.Endpoint.Binding.SendTimeout = new TimeSpan.FromMinutes(5);
Другие вопросы по тегам