修改
看了一会儿后,我觉得这可能是我开发盒上的配置问题。但是,在将源代码干净地下载到不同的开发机器之后,我仍然遇到了这个问题。
我有一个以异步方式调用WCF服务的Silverlight客户端。间歇性地,我将得到一个通用的NotFound
例外。异常(众所周知缺乏细节)间歇性地发生在我呼叫的几乎任何服务上。
这就是事情。通过明智地设置断点,我已经能够确定服务端正常执行。正在检索和返回数据。这个问题似乎更多地出现在客户端。
这就是问题......如果我让服务执行超过10秒,我可以始终如一地发生异常。当我这样做时,它永远不会回到我完成的回调。相反,我在服务的客户端Reference.cs中得到了异常:
public System.Collections.ObjectModel.ObservableCollection<Project.Ui.SilverLight.ServiceName.ModelName> EndGetService(System.IAsyncResult result) {
object[] _args = new object[0];
System.Collections.ObjectModel.ObservableCollection<roject.Ui.SilverLight.ServiceName.ModelName> _result = ((System.Collections.ObjectModel.ObservableCollection<roject.Ui.SilverLight.ServiceName.ModelName>)(base.EndInvoke("GetService", _args, result)));
return _result;
}
我得到的例外(不是很有帮助):
System.ServiceModel.CommunicationException was unhandled by user code
Message=The remote server returned an error: NotFound.
StackTrace:
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 Project.Ui.SilverLight.Service.ServicesClient.ServicesClientChannel.EndGetxxxxx(IAsyncResult result)
at Project.Ui.SilverLight.Service.ServicesClient.Project.Ui.SilverLight.Service.IServices.EndGetxxxx(IAsyncResult result)
at Project.Ui.SilverLight.Service.ServicesClient.OnEndGet(IAsyncResult result)
at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)
InnerException: System.Net.WebException
Message=The remote server returned an error: NotFound.
StackTrace:
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)
InnerException: System.Net.WebException
Message=The remote server returned an error: NotFound.
StackTrace:
at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)
InnerException:
绑定信息(名称已更改,但它们与正在执行的服务匹配)
<binding name="Project.WebUI.Services.xxxxxServices.customBinding0" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00">
<binaryMessageEncoding/>
<httpTransport />
</binding>
...
<service name="Project.WebUI.Services.xxxxxServices">
<endpoint address="" binding="customBinding" bindingConfiguration="Project.WebUI.Services.xxxxxServices.customBinding0"
contract="Project.WebUI.Services.xxxxxServices" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
我相信我已检查过相关的超时。通道的operationTimeout
设置为至少一分钟,ReceiveTimeout和OpenTimeout也是如此。是否有一些关于Silverlight异步WCF调用的问题需要设置为告诉它超过十秒?
答案 0 :(得分:4)
你没有找到gettign的原因不是因为超时。我失去了一个星期试图解决这个问题。
我提到了silverlight,但这不是一个特定于银色的问题。
由于产生错误代码的方式,存在未找到的错误。您需要拦截任何故障并更改错误代码 - 这将导致错误被正确报告而不会因安全性而被过滤掉。
如果您考虑一下,找不到服务器,因为该调用是异步的,并且由于代码中的异常而导致调用已经死亡。
我在我的wcf服务中使用这个类来插件 - 我通过web.config这样做,但是不难改变它,以便它在服务本身上具有ha类级别属性。
您可能想要删除所有合同内容。它正用于我正在进行的项目中,但与此问题无关。
[AttributeUsage(AttributeTargets.Class)]
public class FaultBehavior : Attribute, IServiceBehavior, IEndpointBehavior
{
public class SilverlightFaultMessageInspector : IDispatchMessageInspector
{
public void BeforeSendReply(ref Message reply, object correlationState)
{
Contract.Assume(reply !=null );
if (reply.IsFault)
{
HttpResponseMessageProperty property = new HttpResponseMessageProperty();
// Here the response code is changed to 200.
property.StatusCode = System.Net.HttpStatusCode.OK;
Contract.Assume(reply.Properties != null);
reply.Properties[HttpResponseMessageProperty.Name] = property;
}
}
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// Do nothing to the incoming message.
return null;
}
}
#region IServiceBehavior Members
void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
Contract.Assume( serviceHostBase != null);
Contract.Assume(serviceHostBase.ChannelDispatchers != null);
foreach (ChannelDispatcher cDispatcher in serviceHostBase.ChannelDispatchers)
{
Contract.Assume(cDispatcher != null);
Contract.Assume(cDispatcher.Endpoints != null );
foreach (EndpointDispatcher endpointDisbatcher in cDispatcher.Endpoints)
{
Contract.Assume(endpointDisbatcher != null);
Contract.Assume(endpointDisbatcher.DispatchRuntime != null);
Contract.Assume(endpointDisbatcher.DispatchRuntime.MessageInspectors != null);
endpointDisbatcher.DispatchRuntime.MessageInspectors.Add(new SilverlightFaultMessageInspector());
}
}
}
void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
#endregion
#region IEndpointBehavior Members
void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
Contract.Assume(endpointDispatcher != null);
Contract.Assume(endpointDispatcher.DispatchRuntime != null);
Contract.Assume(endpointDispatcher.DispatchRuntime.MessageInspectors != null);
SilverlightFaultMessageInspector inspector = new SilverlightFaultMessageInspector();
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
}
void IEndpointBehavior.Validate(ServiceEndpoint endpoint)
{
}
#endregion
}
然后你需要定义将出现在web.config中的元素这个
public class FaultHandlerElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new FaultBehavior();
}
public override Type BehaviorType
{
get { return typeof(FaultBehavior); }
}
}
然后在Web配置中,您需要将其添加到服务模型部分 - 故障异常将在其下面有一条波浪线;)
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="faultBehaviourExtension"
type="CopSilverlight.Web.FaultHandlerElement, CopSilverlight.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions
然后你将你的行为挂钩以便像这样使用
<serviceBehaviors>
<behavior name="basicHttpBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<faultBehaviourExtension />
</behavior>
另一种“修复”是打开wcf服务中的跟踪 需要注意的是,如果你不创建目录,它就不会产生日志
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\logs\appName\wcf.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
日志记录并不理想 - 第一个解决方案实际上解决了问题。
我已经实现了这两个,现在我得到了异常,正如你期望的那样冒泡到我的silverlight应用程序。
答案 1 :(得分:3)
答案 2 :(得分:3)
我想知道它是否与this
相同从那个答案中窃取:
检查注册表 HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings 对于一个叫做的值 ReceiveTimeout,如果是则删除 那里。 - cdm9002 5月4日14:30
或者,将其重置为默认值,即1小时(3600000毫秒)。
答案 3 :(得分:1)
在上面的配置文件中,看起来它们来自服务器的配置。您是否也检查了客户端配置?客户端通道上的SendTimeout和ReceiveTimeout属性都默认为一分钟,但可能已经调整或覆盖它们。当然,您应该检查配置XML文件,以及在代码中创建绑定的位置,因为可以设置与配置文件冲突的属性。 (在客户端和服务器上。)
答案 4 :(得分:0)
出于好奇,目前web.config中的idleTimeout是什么?它可能设置为10分钟?
<强>更新强>
所以这是你的问题!这是idleTimeout的一个已知问题!只需删除该设置即可再次使用。