30 May 2011

Method Overloading in Web Services

By default Web Services do not support ‘Method Overloading’.

Reason: when data is passed to an XML Web service it is sent in a request and when it is returned it is sent in a response. Therefore, if an XML Web service contains two or more XML Web service methods with the same name, no uniquely identification will be there. Hence it will produce error.

Solution: To resolve this, MessageName property is required to be attached to Web Method - To uniquely identify polymorphic methods.
public class Calculator : WebService
{
    [WebMethod]
    public int Add(int i, int j) {
       return i + j;
    } 

    [WebMethod(MessageName="Add2")]
    public int Add(int i, int j, int k) {
       return i + j + k;
    }
}


This works perfectly well in .Net 1.x. But in .Net 2.0 this solution solves only one problem. The other problem is related to the ‘Conformity to WS-I Basic Profile v1.1’.

Reason: in .Net 2.0, by default below two attributes are added to the Web Service Class.
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
    // blah
}

This line indicates that your webservice conforms to the Web Services Interopability Organization's (WS-I) Baisc Profile 1.1. The Basic Profile defines a set of rules to which your webservice must conform.

One of its rules is that the webservice May Not Include Method Overloading. If you run a webservice that uses method overloading, you will receive an errormessage telling that your service is not conform to WS-I Basic Profile v1.1:

This produces below error once you have equiped the ‘Web Method’ with ‘MessageName’ property.

Solution: to resolve this error, modify the attribute as:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]

Complete code:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]
public class Service : System.Web.Services.WebService
{
    public Service () {
    }

    [WebMethod]
    public string HelloWorld()
    {     
        return "hello";
    }

    [WebMethod(MessageName = "HelloWorld2")]
    public string HelloWorld(int i)
    {
        return "Overloading";
    }  
}

Trovato qui.

04 May 2011

Convertire una List(Of String) in List(Of Integer)

Dim tmp As List(Of String)(New String() {"1", "2"",3"})

Dim conv As New Converter(Of String, Integer)(AddressOf Convert.ToInt32)

Dim id As List(Of Integer) = tmp.ConvertAll(conv)

Trovato qui.