2015-10-01 4 views
0

Я Реализованы следующие службы WCF:CommunicationException происходит через одну минуту (во время вызова службы WCF с Windows Phone 8 приложения)

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; 
     } 
    } 
} 

"Т.Б." представляет собой текстовое поле определено в представлении 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, исключение не будет выбрано. Я могу подтвердить, что служба работает нормально, а приложение для телефонных окон работает нормально, пока я не удаляю Thread.Sleep (61000). В моем сценарии «реального мира» (который отражает этот упрощенный пример) клиент должен иметь возможность ждать более одной минуты, не выбрасывая CommunicationException. Поскольку пример работает, если я делаю то же самое из приложения WPF, я подозреваю, что проблема связана с ограничением на платформе Windows Phone. Но я не могу найти никакой информации, которая заявляет, что вызовы WCF не могут длиться более одной минуты на Windows Phone.

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

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

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

EDIT: Дубликат-вопрос, отмеченный nvoigt, связан с HttpClient. Этот вопрос касается прокси-сервера WCF с использованием BasicHttpBinding. Основная проблема, без сомнения, такая же, и поэтому мы пришли к выводу, что это ограничение платформы.

+0

Не могли бы вы использовать WebSockets вместо этого? Если вы используете NetHttpBinding и используете контракт обратного вызова, вы можете отправить свой запрос на сервер, а затем сервер отправит ответ на обратный вызов. Если это вариант для вас, я могу предоставить дополнительную информацию. – MattC

+0

К сожалению нет. BasicHttpBinding - единственная поддерживаемая привязка wcf на Windows Phone 8.0 ... или? Может быть, это может быть сделано через портативную библиотеку классов? Спасибо за предложение. – sje

ответ

0

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

var client = new TeaServiceClient(); 
client.ChannelFactory.Endpoint.Binding.SendTimeout = new TimeSpan.FromMinutes(5); 
+0

Это правильно (что нет app.config существует), но ServiceReferences.ClientConfig делает, и значения тайм-аута, установленные оттуда, применяются к прокси-серверу клиента так, как должны. Значения тайм-аута корректно установлены на клиенте. Если я проверяю client.ChannelFactory.Endpoint.Binding.SendTimeout, я вижу значение, указанное мной в ServiceReferences.ClientConfig. – sje