Buongiorno a tutti.
Sto seguendo l'ottimo articolo "jQuery e ASP.NET: come realizzare applicazioni AJAX performanti" e ho realizzato un progettino di prova riguardante la sezione "Servizio WCF JSON", che mi sembra il piu' adatto per le mie esigenze. A differenza del progetto di esempio, vorrei avere il servizio self-hosted e configurato programmaticamente anziche' con il file .config. Conosco i contro di questa scelta, non e' questo il mio problema, in ogni caso so che qualunque cosa si scriva nel file .config ha la sua controparte programmatica: in pratica non deve esserci differenza nei due approcci una volta che il servizio e' in run. Il mio problema e' che tutto funziona con IE, ma con Chrome o Firefox no. Utilizzando invece l'esempio fornito con l'articolo (servizio hosted nel server di sviluppo asp.net e web.config), tutto funziona anche con Chrome e Firefox. Mi sembra di aver "copiato" pari pari quanto trovato nel codice, ma evidentemente non e' cosi'.
Riporto il mio codice ridotto all'osso e spero che qualcuno abbia qualche idea al riguardo.
L'host e' una banalissima ConsoleApplication:
Sub Main()
Dim httpBaseAddress As New Uri("http://localhost:8001/Service")
Dim selfHost As New ServiceHost(GetType(MyService), httpBaseAddress)
Try
' Add a service endpoint
Dim whBnd As New WebHttpBinding
whBnd.CrossDomainScriptAccessEnabled = True
Dim httpEndpoint As Description.ServiceEndpoint = selfHost.AddServiceEndpoint(GetType(IMyService), _
whBnd, _
"MyService")
Dim whb As New Description.WebHttpBehavior
httpEndpoint.Behaviors.Add(whb)
selfHost.Open()
Console.WriteLine("Servizio avviato")
Console.ReadLine()
selfHost.Close()
Catch
selfHost.Abort()
End Try
End Sub
Ho provato ad aggiungere il flag CrossDomainScriptAccessEnabled, ma nulla cambia.
L'interfaccia del servizio:
Imports System.ServiceModel.Web
<ServiceContract()>
Public Interface IMyService
<OperationContract()>
<WebInvoke(Method:="POST", BodyStyle:=WebMessageBodyStyle.Wrapped, ResponseFormat:=WebMessageFormat.Json)>
Sub WebSub()
End Interface
E il servizio:
Public Class MyService
Implements IMyService
Public Sub WebSub() Implements IMyService.WebSub
End Sub
End Class
Dal lato client:
Il codice del file aspx:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script src="js/jquery-1.9.0.min.js" type="text/javascript"></script>
<script src="js/JScript.js" type="text/javascript"></script>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="#" id="lnkWebSub">WebSub</a>
</div>
</form>
</body>
</html>
Nel code-behind non c'e' nulla.
Infine il JScript.js:
jQuery.support.cors = true
$(document).ready(function () {
$("#lnkWebSub").click(getWebSub);
});
function getWebSub() {
$.ajax(
{
type: "POST",
contentType: "application/json; charset=utf-8",
url: "http://localhost:8001/Service/MyService/WebSub",
data: "{}",
dataType: "json",
success: function () { alert("OK!"); },
error: onAjaxError
});
};
function onAjaxError(result) {
alert("ERRORE " + result.status + ": " + result.statusText);
};
Su IE funziona e su Chrome/Firefox ottengo:
ERRORE 0: error
Ringrazio in anticipo chiunque sappia darmi una dritta su questo problema.
Massimo