Я Реализованы следующие службы 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. Основная проблема, без сомнения, такая же, и поэтому мы пришли к выводу, что это ограничение платформы.
Не могли бы вы использовать WebSockets вместо этого? Если вы используете NetHttpBinding и используете контракт обратного вызова, вы можете отправить свой запрос на сервер, а затем сервер отправит ответ на обратный вызов. Если это вариант для вас, я могу предоставить дополнительную информацию. – MattC
К сожалению нет. BasicHttpBinding - единственная поддерживаемая привязка wcf на Windows Phone 8.0 ... или? Может быть, это может быть сделано через портативную библиотеку классов? Спасибо за предложение. – sje