2013-04-02 12 views
14

Per ricreare il problema sto vedendo, utilizzando VS2010, creare un sito Web vuoto e aggiungere un servizio Web (asmx) con code-behind.Il parametro Nullable nel metodo di servizio asmx causa l'errore di un altro metodo

utilizzando il seguente codice, entrambi i webMethods possono essere invocate con successo:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class WebService : System.Web.Services.WebService { 
    [WebMethod] 
    public void Method1(int x) { 
     // i'm good 
    } 
    [WebMethod] 
    public string Method2(int x) { 
     return "it worked"; 
    } 
} 

Ora, se cambio il parm sul metodo di 2 ad un tipo nullable funziona bene, ma renderà il metodo 1 fallire. ..

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class WebService : System.Web.Services.WebService { 
    [WebMethod] 
    public void Method1(int x) { 
     // no changes made to this method, but it no longer works 
    } 
    [WebMethod] 
    public string Method2(int? x) { 
     return "it worked"; 
    } 
} 

L'errore risultante è quella che ho visto prima se un parametro non è presente quando si chiama un servizio:

System.IndexOutOfRangeException: l'indice era fuori dai limiti dell'array . a System.Web.Services.Protocols.HttpServerType..ctor (Tipo ) a System.Web.Services.Protocols.HttpServerProtocol.Initialize() a System.Web.Services.Protocols.ServerProtocolFactory.Create (Tipo tipo, HttpContext contesto, HttpRequest richiesta, HttpResponse risposta, booleano & abortProcessing)

inoltre, questo appare solo per rompere se il primo metodo restituisce void, quindi questo funziona anche bene:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class WebService : System.Web.Services.WebService { 
    [WebMethod] 
    public string Method1(int x) { 
     return "works again"; 
    } 
    [WebMethod] 
    public string Method2(int? x) { 
     return "it worked"; 
    } 
} 

Tutte le idee cosa sta succedendo Qui? Ciò si è verificato usando sia il 3.5 che il 4.0 come framework di riferimento.

edit: ulteriori risposte Giusto per anticipare/commenti in questo senso ... io non sono alla ricerca di informazioni sulle migliori pratiche, le soluzioni alternative, il posto di ASMX nel paesaggio di servizio, WCF, ecc Questo è qualcosa che ho mi sono imbattuto durante il debug di un problema in un'app legacy che non ho scritto e che è già stato risolto, e sono interessato a scoprire la causa del comportamento specifico che ho delineato qui.

+2

ASMX è una tecnologia legacy, e non deve essere utilizzato per un nuovo sviluppo. WCF dovrebbe essere utilizzato per tutti i nuovi sviluppi di client e server di servizi Web. Un suggerimento: Microsoft ha ritirato il [Forum ASMX] (http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads) su MSDN. –

+0

Inoltre, non credo che ASMX supporti i parametri nullable. –

+1

Grazie, ma questo non è un nuovo sviluppo, è una app molto vecchia. L'ho distillato in un semplice campione per illustrare il problema. – heisenberg

risposta

-1

È necessario utilizzare lo Nullable (?) nella soluzione? Penso che tu possa implementare una logica molto semplice come: "Se ricevo una stringa vuota, allora ho un valore Null o se ricevo un valore di stringa" Null ", quindi ho bisogno di usare un oggetto Null" e in futuro considero utilizzo di WCF con l'approccio Nullable-?.

D'altra parte, vi consiglio la modifica di tutti i metodi void su un valore stringa con la parola "ok". Penso che una "richiesta dovrebbe avere una risposta".

+0

Ok. http://stackoverflow.com/questions/5301549/methods-with-nullable-types-not-working-in-asmx-web-service-using-get – CharlyKno

+1

Non lo stesso problema. – heisenberg

1

@heisenberg, stai passando null dall'applicazione, che richiama il metodo web .. Il campione che ho provato funziona bene su VS2010. sotto di esso il codice che ho provato.

codice di esempio:

protected void Button1_Click(object sender, EventArgs e) 
    { 
     WebService1 objws = new WebService1(); 
     objws.voidMethod(5); 
     Label1.Text = objws.HelloWorld(5); 
    } 

codice di servizio ASMX

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class WebService1 : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string HelloWorld(int? x) 
    { 
     if (x != null) 
     { 
      return x.ToString(); 
     } 
     return "Hello World"; 
    } 

    [WebMethod] 
    public void voidMethod(int x) 
    { 

    } 
} 
0

può accadere causa può essere che si sta tentando di inviare lo stesso X per entrambi i metodi se non stanno prendendo la stessa genere?

perché uno è annullabile e un altro no.

1

Ho provato il codice e funziona. Sebbene il debug non funzioni, produce errori.

Penso che stia succedendo perché int nullable non è di tipo primitivo. Vedere la descrizione dal WSDL del servizio "Il modulo di test è disponibile solo per i metodi con tipi primitivi come parametri".

Suppongo che il problema che state affrontando non sia dovuto a Nullable int.

[WebService(Namespace = "http://tempuri.org/")] 

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 

[System.ComponentModel.ToolboxItem(false)] 

public class WebService1 : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public void Method1(int x) 
    { 
     // i'm good 
    } 
    [WebMethod] 
    public string Method2(int? x) 
    { 
     return "it worked"; 
    } 
} 

codice del sito web:

namespace Helper 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      ServiceReference1.WebService1SoapClient web = new ServiceReference1.WebService1SoapClient(); 
      web.Method1(5); 

      string x = web.Method2(5); 
     } 
    } 
} 
Problemi correlati