[Mono-aspnet-list] creating new web service from wsdl

Alexander M. Batishchev abatishchev at godfather.net.ru
Sat Sep 4 06:47:05 EDT 2010


> What do you call these things?

 

Attributes http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

 

From: mono-aspnet-list-bounces at lists.ximian.com
[mailto:mono-aspnet-list-bounces at lists.ximian.com] On Behalf Of Devin
Venable
Sent: Thursday, September 02, 2010 9:41 PM
To: Alberto León
Cc: mono-aspnet-list at lists.ximian.com
Subject: Re: [Mono-aspnet-list] creating new web service from wsdl

 

I believe I've answered my own question, so for the record, it seems you
need to also redeclare the [WebMethod] declaration in braces.  (What do you
call these things?)  Here's a complete example that works. (Imagine that
MathServiceBase.cs was generated by running wsdl2 from existing interface
file.)

 

MathServiceBase.cs:

 

using System;

using System.Web;

using System.Web.Services;

 

namespace MathService

{

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

            public abstract partial class MathServiceBase : WebService

            {

                        [WebMethod]

                        public abstract int AddNumbers (int number1, int
number2);

                        

 

                        [WebMethod]

                        public abstract int SubtractNumbers (int number1,
int number2);

            }

}

 

Now you have to inherit, add override to the methods, and copy the [ ]
blocks from the generated file.

 

MathService.asmx:

 

<%@ WebService Language="C#" Class="MathService.MathService" %>

 

using System;

using System.Web.Services;

 

namespace MathService

{

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

            public class MathService : MathServiceBase

            {

                        [WebMethod]

                        public override int AddNumbers (int number1, int
number2)

                        {

                                   return number1 + number2;

                        }

 

                        [WebMethod]

                        public override int SubtractNumbers (int number1,
int number2)

                        {

                                   return number1 - number2;

                        }

            }

}

 

2010/9/2 Devin Venable <venable.devin at gmail.com>

And with NEW I get this error:

 

TestService.asmx.cs(58,58): Error CS0533:
`blah.blah.EnrollTransmitter(blah.TransmitterEnrollmentRequest)' hides
inherited abstract member
`blah.blahGenerated.EnrollTransmitter(blah.WidgetEnrollmentRequest)'
(CS0533) (TestSOAP2)

 

 

2010/9/2 Devin Venable <venable.devin at gmail.com>

When I don't inherit, I get this compile warning:

 

TestService.asmx.cs(54,54): Warning CS0114:
`MyService.MyService.EnrollTransmitter(GTPServices.WidgetEnrollmentRequest)'
hides inherited member
`MyService.MyServiceGenerated.EnrollTransmitter(TestService.WidgetEnrollment
Request)'. To make the current member override that implementation, add the
override keyword. Otherwise add the new keyword (CS0114) (TestSOAP2)

 

Should I use the new keyword?

 

2010/9/2 Alberto León <leontiscar at gmail.com>

Y do not need to override WidgetEnrollmentResponse.

 

2010/9/2 Devin Venable <venable.devin at gmail.com>

Simple inheritance didn't seem to work, at least not using my pattern.  Here
is a fragment of the code (variable names changed to protect the innocent):

 

In TestService.asmx:

 

<%@ WebService Language="C#" Class="MyService.MyService" %>

 

In MyServiceGenerated.cs:

 

namespace MyService

{

 

/// <remarks/>

[System.Web.Services.WebServiceAttribute(Namespace="http://tempuri.org/")]

[System.Web.Services.WebServiceBinding(Name="BasicHttpBinding_IMyServices",
Namespace="http://tempuri.org/")]

public abstract partial class MyServiceGenerated :
System.Web.Services.WebService {

    

    [System.Web.Services.WebMethodAttribute()]

 
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.o
rg/IMyServices/EnrollTransmitter", RequestNamespace="http://tempuri.org/",
ResponseNamespace="http://tempuri.org/",
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped,
Use=System.Web.Services.Description.SoapBindingUse.Literal)]

    [return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]

    public abstract WidgetEnrollmentResponse
EnrollTransmitter([System.Xml.Serialization.XmlElementAttribute(IsNullable=t
rue)] WidgetEnrollmentRequest request);

    ...

 

In TestService.asmx.cs:

 

namespace MyService

{

public class MyService : MyServiceGenerated

{

 

public override WidgetEnrollmentResponse
EnrollTransmitter(WidgetEnrollmentRequest request)

{

                        // TODO implement

return null;

}

 

 

Okay, so now when I deploy this, the web page shows up and there are no
visible service methods.  What am I doing wrong, or better yet, what is the
best practice for what I'm trying to do?

 

And thanks for the help!

 

2010/9/2 Alberto León <leontiscar at gmail.com>

 

You need inherit MyServices in other class.
An abtract class can't be instantiated, created, and can't store data.
Allways need to be inherited.




2010/9/2 Devin Venable <venable.devin at gmail.com>

Background:  Linux developer new to .NET.  In the past I've successfully
deployed simple web services by creating asmx files and running them under
Apache via XSP.

Need: Create web service implementation from WSDL defined by 3rd party

 

This is what I've tried so far...

 

1. Used wsdl2 to generate server stubs.

 

wsdl2 -server MyServices.wsdl 

Web Services Description Language Utility

Mono Framework v2.0.50727.1433

 

There where some warnings while generating the code:

 

  MyServices.wsdl

    - This web reference does not conform to WS-I Basic Profile v1.1

        R2718: A wsdl:binding in a DESCRIPTION MUST have the same set of

        wsdl:operations as the wsdl:portType to which it refers.

          * Binding 'BasicHttpBinding_IMyServices', in Service Description

            ' <http://tempuri.org/> http://tempuri.org/'

 

 

(should this warning make me nervous?)

 

2. Renamed resulting cs file to MyServices.asmx

3. Added header to file:

 

<%@ WebService Language="c#" Codebehind="MyServices.asmx.cs"
Class="MyServices" %>

 

This KINDA worked.  I can load up and view the page in my browser:

 

 <http://localhost/MyServices.asmx> http://localhost/MyServices.asmx

 

But when I try to invoke a method on the service from the web forms that
display, I get a message like:

 

500 - Internal Server Error

System.MissingMethodException: Cannot create an abstract class 'MyServices'.
  at System.Activator.CheckAbstractType (System.Type type) [0x00000] 
  at System.Activator.CreateInstance (System.Type type, Boolean nonPublic)
[0x00000] 
  at System.Activator.CreateInstance (System.Type type) [0x00000] 
  at System.Web.Services.Protocols.WebServiceHandler.CreateServerInstance ()
[0x00000] 
  at System.Web.Services.Protocols.HttpSimpleWebServiceHandler.Invoke
(System.Web.Services.Protocols.LogicalMethodInfo method, System.Object[]
parameters) [0x00000] 
  at
System.Web.Services.Protocols.HttpSimpleWebServiceHandler.ProcessRequest
(System.Web.HttpContext context) [0x00000] 

 

 

Though I'm not a .NET developer, I'm a developer and can see why trying to
create an instance of an abstract class would be an issue.  What I'm not
clear on is what is the best

pattern to implement the concrete methods.   I've tried implementing a
concrete class with all of the methods in the asmx and made the class
inherit from the class generated by

wsdl2, but when I run the application, the methods disappear.  I'm guessing
I need to copy all of the blocks that look like this into the concrete
class:

 

 [System.Web.Services.WebMethodAttribute()]

 
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.o
rg/IGTPServices/EnrollTransmitter", RequestNamespace="http://tempuri.org/",
ResponseNamespace="http://tempuri.org/",
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped,
Use=System.Web.Services.Description.SoapBindingUse.Literal)]

    [return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]

 

If anyone can point me to a short tutorial for creating a web service in
Mono using an existing WSDL, or give me tips herre, I would appreciate it.

 

 

_______________________________________________
Mono-aspnet-list mailing list
Mono-aspnet-list at lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-aspnet-list

 

 


_______________________________________________
Mono-aspnet-list mailing list
Mono-aspnet-list at lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-aspnet-list

 

 

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-aspnet-list/attachments/20100904/e1d2c1db/attachment-0001.html 


More information about the Mono-aspnet-list mailing list