Silverlight Crossdomain
cross-domain (13)
¡He visto muchos enlaces a MSDN y "funciona en mi máquina"! respuestas, así que me gustaría hacer mi pregunta con los pasos exactos para duplicar lo que estoy haciendo. Debido a que estamos utilizando un servicio web ya existente, estoy preguntando en el contexto de tener un servicio web alojado fuera de mi proyecto, a diferencia de muchos de los tutoriales y videos en línea. Así que aquí va:
*** Cree un nuevo proyecto de servicio web ASP.NET.
Viene con un archivo Service.asmx existente que expone un método web "HelloWorld".
Ver en el navegador, presione el botón "Invocar". Debería funcionar devolviendo la cadena "Hello World".
En mi máquina, la URL es: " http://localhost:15511/WebSite5/Service.asmx "
*** Inicie una nueva instancia de Visual Studio, cree un proyecto de aplicación web de Silverlight.
*** Ponga un solo botón allí con un controlador de eventos para llamar al servicio web. Destruyo personalmente la red y uso un StackPanel simple. p.ej.
<UserControl x:Class="SilverlightApplication1.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<StackPanel>
<Button Click="Button_Click">
<Button.Content>
<TextBlock Text="Test"/>
</Button.Content>
</Button>
</StackPanel>
</UserControl>
Agregue la referencia web, utilizando la instrucción y el controlador de eventos para Button_Click:
private void Button_Click(object sender, RoutedEventArgs e)
{
ServiceSoapClient client = new ServiceSoapClient();
client.HelloWorldCompleted += (object s, HelloWorldCompletedEventArgs ea) => {
MessageBox.Show(ea.Result);
};
client.HelloWorldAsync();
}
- Ejecute la aplicación Silverlight. En mi caso, voy a ir a la página de prueba de Silverlight en: http://localhost:15558/SilverlightApplication1TestPage.aspx
Ejecutar y, por supuesto, explota debido a problemas de dominio cruzado. A continuación, agregue el archivo clientaccesspolicy.xml con lo siguiente a la raíz de su aplicación web que aloja el servicio:
<?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 include-subpaths="true" path="/"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
Esto debería abrir las cosas ya que tiene un comodín para encabezados, uris y recursos, ¿verdad?
- Ejecuta nuevamente y obtienes un error:
Se produjo un error al intentar realizar una solicitud al URI '' http://localhost:15511/WebSite5/Service.asmx ''. Esto podría deberse a intentar acceder a un servicio de forma multidominio sin una política adecuada de dominios cruzados, o una política que no sea adecuada para los servicios SOAP. Es posible que necesite ponerse en contacto con el propietario del servicio para publicar un archivo de política entre dominios y para garantizar que se envíen los encabezados HTTP relacionados con SOAP.
Entonces pregunta: ¿hay un secreto para el archivo clientaccesspolicy? Uno podría alternativamente probar con el crossdomain.xml pero da un resultado similar.
Configuración del cliente
¿Tal vez su ServiceReferences.ClientConfig
para su cliente de Silverlight está apuntando a la URL incorrecta?
Además, verifique la ubicación de su archivo de política entre dominios. Este artículo de MSDN tiene más información.
Locally Running Silverlight
Nota adicional para ejecutar Silverlight localmente (Vista Sidebar, por ejemplo). Como se informa en esta entrada del blog , "Silverlight no puede usar ningún proveedor de red cuando se ejecuta localmente". La solución alternativa es usar javascript para interactuar con el servicio web en esta situación.
¿Has probado el fiddler al usar esto a través de IE, es posible que puedas ver el tráfico que está causando silverlight, como qué archivos de política cruzada está buscando?
Algo que funcionó para mí comenzó con lo que encontré en los foros de Silverlight here . Básicamente, me preguntó si podía acceder a mi clientaccesspolicy.xml o crossdomain.xml desde localhost (http: //localhost/clientaccesspolicy.xml). Cuando traté de navegar allí, no pude, así que simplemente encontré el código para ambos (también dentro del hilo antes mencionado), y copié y pegué el código dentro de esos archivos existentes en mi directorio inetpub / wwwroot / (I los abrió usando Notepad ++). La parte más extraña fue que el código no cambió en absoluto , y sin embargo, ¡funciona! Espero que ayude a alguien! Esto fue extremadamente extraño.
clientaccesspolicy.xml
<?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>
crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
¡Se bendecido!
-sf
Asegúrese de poner el archivo clientaccesspolicy.xml en la raíz del directorio web de IIS, por ejemplo
C: / Inetpub / wwwroot / clientaccesspolicy.xml
Esto asegurará que se pueda acceder directamente a http: ///clientaccesspolicy.xml
Estaba obteniendo el mismo error y lo resolví siguiendo los pasos anteriores.
Compruebe qué proyecto se establece de forma predeterminada. Debe ser el proyecto web que debe establecerse de manera predeterminada y no el proyecto Silverlight.
Debe tener en cuenta que cuando haga referencia a su servicio dentro de su proyecto, se creará el archivo "Reference.ClienConfig" y allí está:
**
<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
name="ServisSoap" />
**
Asegúrese de que su página siga usando el mismo puerto (por ejemplo, aquí está 57675). Por defecto, su servidor local obtendrá un puerto aleatorio, por lo que debe cambiarlo para que sea un número estático y no dinámico. (Haga clic derecho en el proyecto asp.net / Tab Web / puerto específico / número de tipo Espero que ayude
El problema podría ser que su servidor de desarrollo no puede servir el archivo xml, intente esto: explícitamente haga que esté disponible a través de WebGet.
[ServiceContract]
public interface ICrossDomainService
{
[OperationContract]
[WebGet(UriTemplate = "ClientAccessPolicy.xml")]
Message ProvidePolicyFile();
}
y luego ProvidePolicyFile () puede ser
public System.ServiceModel.Channels.Message ProvidePolicyFile()
{
FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
// Either specify ClientAcessPolicy.xml file path properly
// or put that in /Bin folder of the console application
XmlReader reader = XmlReader.Create(filestream);
System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
return result;
}
Estaba enfrentando el mismo problema y tardé más de 3 días en resolver el problema. También me di cuenta de que cuando llamaba al servicio de nube de Internet WCF desde una aplicación de Silverlight alojada en otro servidor web, solo mostraba errores entre dominios. Después de examinar algunas publicaciones, no resolví el problema, incluso colocando archivos cross-domain.xml y clientaccesspolice.xml en el directorio raíz del servicio. Así que solo trato de usar http://example.com . Solo lo cambio para asegurar https://example.com y funcionó bien. Los errores entre dominios desaparecen. el servicio fue llamado sin problemas.
Funcionó en mi pc con éxito, puede colocar su
clientaccesspolicy.xml
<?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>
tanto su directorio de proyectos como su raíz de servicios web.
He encontrado este problema (SL v5.0 y Visual Studio 2010), lo que me solucionó es que ingresé a las propiedades del proyecto de Silverlight >> pestaña Silverlight y seleccioné "Requerir confianza elevada al ejecutar en el navegador"
He tenido el mismo problema un par de veces. En el pasado, he resuelto esto usando la aplicación web como inicio, pero parece que ya lo has hecho.
Mi publicación sobre el tema: http://www.donnfelker.com/silverlight-cross-domain-issue/
Me encontré con algo así y al agregar un ServiceHostFactory solucioné mi problema. El archivo de política de dominios cruzados solo no lo solucionó.
class MyHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
MyHost customServiceHost =
new MyHost(serviceType, new Uri("[Your URL goes here]",UriKind.Absolute));
return customServiceHost;
}
}
class MyHost : ServiceHost
{
public MyHost(Type serviceType, params Uri[] baseAddresses) base(serviceType, baseAddresses)
{ }
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
}
}
También debe agregar Factory = "MyHostFactory" en la etiqueta que define su servicio
Modifiqué mi configuración de Internet Explorer. El sitio web se ejecuta en un servidor web interno, así que lo agregué a la lista de sitios de confianza de Iexplorer. (Herramientas-> Opciones de Internet-> Seguridad-> Sitios).
Luego cambié el nivel de seguridad y habilité dominios cruzados. Listo, funciona pero me llevó un tiempo encontrar la solución.
Mejor, Jeppen