c# - Servicio de descanso Silverlight, excepción de seguridad
rest (3)
Intento que Silverlight trabaje con una aplicación de muestra rápida y llamo a un servicio de descanso en otra computadora. El servidor que tiene el servicio de descanso tiene un clientaccesspolicy.xml que se ve así:
<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 de acuerdo con los rastreos de red que he ejecutado), y no hay solicitud para crossdomain.xml. El código de C # se ve así:
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 obtengo el siguiente error de seguridad:
{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?
No pude hacer eliminaciones HTTP REST de dominio cruzado sin agregar http-methods = "*" al elemento allow-from en clientaccesspolicy.xml. Cuando agregué el atributo http-methods, todo funcionó y dejó de suceder SecurityException.
Si aún no lo has hecho, primero intentaré cambiar el restUrl a algo más simple como una página HTML estática en el mismo servidor (o si es necesario en tu propio servidor) solo para verificar que tu código principal funcione.
Suponiendo que la excepción de seguridad es específica para esa URL REST (o sitio), puede echar un vistazo a las Restricciones de acceso URL en el artículo de 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.
Se produjo un error al cargar páginas HTML de un "Sitio de confianza" para mi aplicación local ( http: // localhost / ) - hasta que agregué localhost a la lista de Sitios de confianza.
Silverlight evita llamadas de "zona cruzada" (en mi caso, Red local frente a Sitios de confianza) y llamadas de "combinación cruzada" (por ejemplo, http vs. https).
Y hasta ahora solo funciona con un archivo "crossdomain.xml". Intenté "clientaccesspolicy.xml" primero, pero no lo hice funcionar.