Причина, по которой вас не нашли, это НЕ из-за тайм-аута. Я потерял неделю, пытаясь понять это.
У меня есть ссылки на silverlight, но это не специфическая проблема для silverlight.
Не найденная ошибка существует из-за способа создания кодов ошибок. Вам необходимо перехватить любые ошибки и изменить код ошибки - это приведет к тому, что ошибки будут сообщаться должным образом и не исчезать из-за безопасности.
Если вы подумаете об этом, сервер не найден, поскольку вызов асинхронный, и он умер из-за исключения в вашем коде.
Я использую этот класс в своем сервисе wcf для подключения - я делаю это через web.config, однако изменить его несложно, чтобы он выполнялся с атрибутом уровня класса для самой службы.
вы, вероятно, захотите убрать все контрактные вещи. Он используется в проекте, над которым я работаю, но никак не связан с этой проблемой.
[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 lik this
public class FaultHandlerElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new FaultBehavior();
}
public override Type BehaviorType
{
get { return typeof(FaultBehavior); }
}
}
и затем в веб-конфигурации вам нужно добавить это в раздел модели сервиса - исключение ошибки будет иметь волнистую линию под ним;)
<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, как и следовало ожидать.