最近、プログラムでWCFバインディングを設定してプロキシを生成するように、コードベースを切り替えました。我々は、ServiceReferences.clientconfigで設定を定義することに移りました。それ以来、いくつかの長いWCFコールがSilverlightでタイムアウトしていましたが、私は理由を知りません。バインディング内のすべてのタイムアウトを24時間に設定しました。問題を診断する方法についていくつかの提案が必要です。Silverlight WCFタイムアウト
最初は、数分後にエラーが発生するが、サーバー側のコードが続行され、最終的には正常に完了するため、問題はクライアント側でタイムアウトと考えられました。しかし、私は今これについて完全には分かっていません。私はKestrelのログウィンドウを見ていて、サーバー側で操作が続けられていても、Silverlightでエラーが発生したのと同時に要求が完了したことに気付いた。しかし、私は、サーバー側でOperationTimeoutを設定するための情報を見つけることができません。ここでは、サーバー側のバインディングがある:
private static CustomBinding CreateCustomBinding()
{
var httpTransportBindingElement = new HttpTransportBindingElement
{
MaxBufferPoolSize = 2147483647,
MaxBufferSize = 2147483647,
MaxReceivedMessageSize = 2147483647
};
var bindingElements = new BindingElementCollection();
var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement
{
MaxReadPoolSize = 2147483647,
MaxSessionSize = 2147483647,
MaxWritePoolSize = 2147483647,
ReaderQuotas = new XmlDictionaryReaderQuotas
{
MaxDepth = 2147483647,
MaxStringContentLength = 2147483647,
MaxArrayLength = 2147483647,
MaxBytesPerRead = 2147483647,
MaxNameTableCharCount = 2147483647
}
};
bindingElements.Add(binaryMessageEncodingBindingElement);
bindingElements.Add(httpTransportBindingElement);
var binding = new CustomBinding(bindingElements)
{
Name = "UserNameBinding",
CloseTimeout = new TimeSpan(24, 0, 0),
OpenTimeout = new TimeSpan(24, 0, 0),
ReceiveTimeout = new TimeSpan(24, 0, 0),
SendTimeout = new TimeSpan(24, 0, 0)
};
return binding;
}
ここでバインディングがクライアント側で作成する方法のためのコードです。ここで私が紛失している他のコードがあるかどうかを教えてください。私はこのコードをデバッグして、プロキシがこのバインディングセットを取得していることを確認しています。
public static Binding GetWCFBinding(bool isHttps)
{
var binding = new CustomBinding
{
CloseTimeout = new TimeSpan(24, 00, 00),
OpenTimeout = new TimeSpan(24, 00, 00),
ReceiveTimeout = new TimeSpan(24, 00, 00),
SendTimeout = new TimeSpan(24, 00, 00)
};
var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement();
binding.Elements.Add(binaryMessageEncodingBindingElement);
binding.Elements.Add(isHttps
? new HttpsTransportBindingElement()
{
MaxBufferSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue,
TransferMode = TransferMode.Buffered
}
: new HttpTransportBindingElement()
{
MaxBufferSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue,
TransferMode = TransferMode.Buffered
});
return binding;
}
私はまた、プロキシのコンストラクタで、この行を入れている:
InnerChannel.OperationTimeout =新しいのTimeSpan(24、0、0);
エラーは、何かが、サーバーまたはクライアントがタイムアウトにうまくいかないときは常に返します。この非descriptのエラーです:
Module: Adapt.Presentation.Xivic.CodeGeneration Exception Message: The remote server returned an error: NotFound. Time: 6/03/2017 4:17:55 PM Stack Trace: ThrowForNonSuccess at offset 90 in file:line:column :0:0 HandleNonSuccess at offset 87 in file:line:column :0:0 GetResult at offset 30 in file:line:column :0:0 MoveNext at offset 525 in file:line:column :0:0 Full 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.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClassa.b__9(Object sendState) at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.b__0(Object sendState) --- End of inner exception stack trace --- at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result) --- End of inner exception stack trace --- at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) at Microsoft.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Adapt.Presentation.Xivic.CodeGeneration.d__15.MoveNext()