15 messaggi dal 14 marzo 2011
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
15 messaggi dal 14 marzo 2011
Ho risolto, posto la soluzione se a qualcuno puo' interessare, o anche se qualcuno ha soluzioni migliori al riguardo.
Ho dovuto usare JSONP, le modifiche al codice precedente sono poche.
Nel servizio ho dovuto usare GET anziche' POST:
<ServiceContract()>
Public Interface IMyService
  <OperationContract()>
  <WebGet(BodyStyle:=WebMessageBodyStyle.Wrapped, ResponseFormat:=WebMessageFormat.Json)>
  Sub WebSub()
End Interface


Nel client ho cosi' modificato la funzione JavaScript GetWebSub:
function getWebSub() {
    $.ajax(
    {
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: "http://localhost:8001/Service/MyService/WebSub",
        data: {},
        dataType: "jsonp",
        success: function () { alert("OK!"); },
        error: onAjaxError
    });
};

Ed ora tutto funziona.
Massimo

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.