2013-04-02 23 views
14

Aby odtworzyć problem, który widzę, używając VS2010, stwórz pustą stronę internetową i dodaj usługę sieciową (asmx) z opcją kodu.Parametr Nullable w metodzie serwisowej asmx powoduje awarię innej metody.

Korzystanie poniższy kod, obie webMethods mogą być wywoływane z powodzeniem:

[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"; 
    } 
} 

Teraz, jeśli mogę zmienić parmezanem na metody 2 do wartości pustych typu to działa dobrze, ale uczyni to metoda 1 niepowodzeniem. ..

[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"; 
    } 
} 

Uzyskany błąd to taki, który widziałem wcześniej, jeśli param brakuje podczas wywoływania usługi:

System.IndexOutOfRangeException: Indeks był poza obszarem tablicy . w System.Web.Services.Protocols.HttpServerType..ctor (Type type) at System.Web.Services.Protocols.HttpServerProtocol.Initialize() at System.Web.Services.Protocols.ServerProtocolFactory.Create (Typ typu, HttpContext kontekst, HttpRequest prośba, HttpResponse odpowiedź, Boolean & abortProcessing)

również ten pojawia się tylko przełamać jeśli pierwsza metoda zwraca void, więc ten również działa dobrze:

[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"; 
    } 
} 

Wszelkie pomysły co się dzieje tutaj? Nastąpiło to przy użyciu zarówno 3.5 jak i 4.0 jako szkielet docelowy.

edytuj: Tylko po to, aby uprzedzić dalsze odpowiedzi/komentarze wzdłuż tych linii ... Nie szukam porady na temat najlepszych praktyk, alternatywnych rozwiązań, miejsca dla Asmx w krajobrazie usług, wcf itp. To jest coś, co natknąłem się na debugowanie problemu w starszej aplikacji, której nie napisałem i który został już naprawiony, i jestem zainteresowany odkryciem przyczyny określonego zachowania, które tutaj opisałem.

+2

ASMX to technologia starszego typu, i nie powinny być wykorzystywane do nowego rozwoju. WCF powinien być używany do wszystkich nowych projektów klientów i serwerów usług sieciowych. Jedna wskazówka: Microsoft przeszedł na [ASMX Forum] (http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads) na MSDN. –

+0

Ponadto, nie wierzę, że ASMX obsługuje parametry zerowe. –

+1

Dzięki, ale to nie jest nowy rozwój, to bardzo stara aplikacja. Przefiltrowałem go do prostej próbki, aby zilustrować problem. – heisenberg

Odpowiedz

-1

Czy konieczne jest użycie urządzenia Nullable (?)? Myślę, że możesz zaimplementować bardzo prostą logikę, taką jak: "Jeśli otrzymam pusty Ciąg, wtedy mam wartość Null lub jeśli otrzymam wartość" Null ", wtedy potrzebuję użyć obiektu Null" i W przyszłości rozważ korzystanie z WCF z podejściem Nullable-?.

Z drugiej strony, zalecam zmianę wszystkich nieważnych metod na wartość ciągu znaków ze słowem "ok". Myślę, że "prośba powinna mieć odpowiedź".

+0

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

+1

Nie ten sam problem. – heisenberg

1

@heisenberg, czy pomijam wartość null z aplikacji, która wywołuje metodę sieci .. Próbka, którą próbowałem, działa poprawnie na vs2010. poniżej kod, który próbowałem.

Przykładowy kod:

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

usługi Kod 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

może się zdarzyć, przyczyny mogą być próbujesz wysłać ten sam X do obu metod choć nie biorą takie same rodzaj?

ponieważ jeden jest zerowy, a drugi nie.

1

Wypróbowałem twój kod i działa. Chociaż debugowanie nie działa, powoduje błąd.

Myślę, że tak się dzieje, ponieważ int neutralny nie jest typem pierwotnym. Zobacz opis z WSDL usługi "Formularz testowy jest dostępny tylko dla metod z typami pierwotnymi jako parametrami".

Przypuszczam, że problem, przed którym stoisz, nie jest spowodowany interem Nullable.

[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"; 
    } 
} 

kod strony:

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); 
     } 
    } 
} 
Powiązane problemy