Error entre dominios Silverlight+WCF
cross-domain cross-domain-policy (2)
He leído la mayoría de los temas que cubren errores de dominio cruzado y todavía no puedo ponerlo en funcionamiento. Dentro del sitio web, cargo el módulo Silverlight que se comunica con WCF Webservice. En localhost, funciona bien, no se produjo ningún error.
Tengo servicio web alojado en http: // localhost: 50283 y en la misma carpeta que el puerto 50283 se refiere a que tengo clientaccesspolicy.xml ubicado que se ve de la siguiente manera
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Puse clientaccesspolicy.XML casi en todas partes, incluido / wwwroot, pero eso no tuvo ningún efecto de todos modos. Puedo acceder a clientaccesspolicy.xml tanto en una computadora local como en otra dentro de la misma red ( http: // computerIP: 50283 / clientaccesspolicy.xml muestra contenido).
Traté de interceptar el error para encontrar más detalles sobre la naturaleza del error, pero violín no incluye ningún error, el único navegador lo hace. Literalmente, probé todo y todavía no cambio. ¿Alguien se ha enfrentado a un problema similar y podría proporcionar algunos consejos en los que debería buscar una solución?
Me encontré con un tema similar sin solución también, por desgracia
Excepción entre dominios de Silverlight a WCF, pero clientaccesspolicy.xml se está leyendo con éxito
No estoy seguro si tiene que hacer algo con eso, pero tengo una configuración similar y mi clientaccesspolicy.xml se ve un poco diferente.
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="http://*"/>
<domain uri="https://*" />
</allow-from>
<grant-to>
<resource include-subpaths="true" path="/"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Especialmente la división de las direcciones http y https es diferente. Además de que está tratando de hacer esto con un puerto no predeterminado, ¿lo ha probado en el puerto predeterminado 80? Ah, y en el entorno de producción, esos * se reemplazan con el nombre de dominio real.
Recuerdo encontrarme con esto hace muchos años y resolverlo de una manera un tanto diferente, es decir, con un comportamiento. Considera lo siguiente:
using System;
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.Xml;
internal class CrossDomainServiceBehavior : BehaviorExtensionElement, IEndpointBehavior
{
private ServiceHost serviceHost;
public override Type BehaviorType
{
get { return typeof(CrossDomainServiceBehavior); }
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
if (serviceHost == null)
{
serviceHost = new ServiceHost(typeof(CrossDomainPolicyService));
string address = new Uri(endpoint.Address.Uri, "/").ToString();
ServiceEndpoint crossDomainEndpoint = serviceHost.AddServiceEndpoint(typeof(ICrossDomainPolicyService), new WebHttpBinding(), address);
crossDomainEndpoint.Behaviors.Add(new WebHttpBehavior());
serviceHost.Open();
}
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
protected override object CreateBehavior()
{
return new CrossDomainServiceBehavior();
}
}
internal class CrossDomainPolicyService : ICrossDomainPolicyService
{
public Message ProvideClientAccessPolicyFile()
{
XmlReader xmlReader = CreateClientAccessXml();
return Message.CreateMessage(MessageVersion.None, string.Empty, xmlReader);
}
public Message ProvideCrossDomainPolicyFile()
{
XmlReader xmlReader = CreateCrossDomainXml();
return Message.CreateMessage(MessageVersion.None, string.Empty, xmlReader);
}
private static XmlReader CreateClientAccessXml()
{
TextReader reader = new StringReader(@"<?xml version=''1.0'' encoding=''utf-8''?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers=''*'' >
<domain uri=''*''/>
</allow-from>
<grant-to>
<resource path=''/'' include-subpaths=''true''/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>");
return XmlReader.Create(reader);
}
private static XmlReader CreateCrossDomainXml()
{
TextReader reader = new StringReader(@"<?xml version=''1.0''?>
<cross-domain-policy>
<allow-http-request-headers-from domain=''*'' headers=''*''/>
</cross-domain-policy>");
return XmlReader.Create(reader);
}
}
El CrossDomainServiceBehavior debe agregarse a los comportamientos en su servicio WCF y usa CrossDomainPolicyService para agregar dinámicamente la política de dominio cruzado. Esto evita que tenga que agregar el archivo de dominio cruzado al sitio web.
Agregar el comportamiento del código (por ejemplo, con servicios alojados por uno mismo):
endPoint.Behaviors.Add(new CrossDomainServiceBehavior());
O en el caso de las definiciones de WCF en la configuración: en aras de este ejemplo, supondré que CrossDomainServiceBehavior está en el namespace Services.CrossDomainServiceBehavior y el ensamblado en el que se encuentra es de la versión 1.0.0.0 con una cultura neutral. También asume que tiene un enlace en su declaración de servicio llamado webHttp.
Registrando el comportamiento:
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="CrossDomainServiceBehavior" type="Services.CrossDomainServiceBehavior, CrossDomainServiceBehavior.AssemblyName, Version=1.0.0.0, Culture=neutral" />
</behaviorExtensions>
</extensions>
Declara el comportamiento:
<behaviors>
<endpointBehaviors>
<behavior name="CrossDomainServiceBehavior">
<webHttp/>
<CrossDomainServiceBehavior/>
</behavior>
</endpointBehaviors>
<behaviors>
Agregue el comportamiento al enlace (aquí como ejemplo uno llamado webHttp):
<bindings>
<webHttpBinding>
<binding name="webHttp"
maxReceivedMessageSize="20000000" >
<security mode="None">
<transport clientCredentialType = "None"/>
</security>
</binding>
<CrossDomainServiceBehavior />
</webHttpBinding>
</bindings>
Finalmente, agregue el comportamiento a su punto final de servicio, aquí en el ejemplo uno que implementa ISomeService:
<endpoint address="" binding="webHttpBinding" contract="Services.ISomeService" bindingConfiguration="webHttp" behaviorConfiguration="CrossDomainServiceBehavior "/>