2008-10-31 21 views
13

Estoy intentando que Silverlight trabaje con una aplicación de muestra rápida y llamo a un servicio de reposo en otra computadora. El servidor que tiene el resto servicio tiene un clientaccesspolicy.xml que se parece a:Servicio de reposo Silverlight, excepción de seguridad

<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> 

y está siendo recogido (al menos según las trazas de red los he corrido), y no hay ninguna solicitud de crossdomain. xml. El código C# parece:

public Page() 
{ 
    InitializeComponent(); 

    string restUrl = "http://example.com/rest_service.html?action=test_result"; 

    WebClient testService = new WebClient(); 
    testService.DownloadStringCompleted += new DownloadStringCompletedEventHandler(testService_DownloadStringCompleted); 
    testService.DownloadStringAsync(new Uri(restUrl, UriKind.Absolute)); 

} 

void testService_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
{ 
    if (e.Error == null) 
    { 
     LoadTreeViewWithData(e.Result); 
    } 
} 

Sin embargo, siempre me sale el siguiente error de Seguridad de vuelta:

 
{System.Security.SecurityException ---> System.Security.SecurityException: Security error. 
    at System.Net.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
    at System.Net.BrowserHttpWebRequest.c__DisplayClass5.b__4(Object sendState) 
    at System.Net.AsyncHelper.c__DisplayClass2.b__0(Object sendState) 
    --- End of inner exception stack trace --- 
    at System.Net.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) 
    at System.Net.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
    at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result) 
    at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)} 

¿Qué estoy haciendo mal? ¿Y por qué el error de seguridad no me da información más útil?

+1

¿Qué fue lo que tuvo que cambiar para que funcione? – stimms

+0

No puede llamar a servicios de descanso cuando su proyecto Silverlight no es un proyecto web. –

Respuesta

8

Si aún no lo ha hecho, primero intentaría cambiar el restUrl por algo más simple como una página HTML estática en el mismo servidor (o si fuera necesario en su propio servidor) solo para verificar que su código principal funciona .

Suponiendo que la excepción de seguridad es específica de esa URL REST (o sitio), puede echar un vistazo al artículo URL Access Restrictions in Silverlight 2. Existen algunas reglas de seguridad no obvias que incluyen tipos de archivos y "zonas de Internet" además de las reglas de dominio cruzado más conocidas.

En segundo lugar, la queja sobre muchos mensajes de excepción en Silverlight no fue muy útil. El artículo mencionado de MSDN contiene una nota divertida:

Cuando los usuarios obtienen un error que resulta de una de estas políticas de acceso violadas, el error puede no indicar la causa exacta.

+0

Ah, la restricción poco conocida entre zonas ... Me llevó varios días darme cuenta de que estaba causando mis problemas. Gracias por el enlace. +1 – Phil

0

La carga de páginas HTML a partir de un "sitio de confianza" fallaron para mi aplicación local (http://localhost/) - hasta que he añadido localhost a la lista de sitios de confianza.

Silverlight evita las llamadas de "zona cruzada" (en mi caso, Red local frente a Sitios de confianza) y las llamadas "esquema cruzado" (por ejemplo, http vs. https).

Y hasta el momento solo funciona con un archivo "crossdomain.xml". Intenté "clientaccesspolicy.xml" primero, pero no lo hice funcionar.

4

No pude hacer el dominio cruzado REST HTTP elimina sin agregar http-methods = "*" al elemento allow-from en clientaccesspolicy.xml. Cuando agregué el atributo http-methods, todo funcionó y dejó de suceder SecurityException.

+0

Gracias por esto, este también fue mi problema. –

Cuestiones relacionadas