NANWSI: Not Another .NET Web Service Issue

Hi all,

I'm still quite new to Ruby, I come from years of "evil" development (MS
and .NET).
I am using ruby1.9.1 and soap4r to communicate with a .NET web service.

I've seen several posts, several advices, several "solutions"; I tried
them all, and still it doesn't work...
I've been trying different approaches for a couple of days now, and I
feel I am getting stuck.

My dumb web service is here: http://78.136.25.213/Test/ws/Service.asmx
From here you can get its WSDL:
http://78.136.25.213/Test/ws/Service.asmx?wsdl

It's a basic ws that expects a single string parameter ("inputString")
as input and returns a single string as output. That simple (this is a
test of course).

This is the code of my client:

···

-------------------------------------------------------------------------------
require "soap/rpc/driver"
require "RechnerServiceModule"
include RechnerServiceModule

server = 'http://78.136.25.213/Test/ws/Service.asmx'
wiredump_dev=STDERR
service = SOAP::RPC::Driver.new(server,
RechnerServiceModule::InterfaceNS)
service.use_default_namespace = true
service.default_encodingstyle =
SOAP::EncodingStyle::ASPDotNetHandler::Namespace
service.wiredump_dev=wiredump_dev
RechnerServiceModule::add_method(service)
result = service.TestWS(:parameter => "testString")
print("Result: ", result)
-------------------------------------------------------------------------------

This is the RechnerServiceModule:

-------------------------------------------------------------------------------
###file:servicemodule.rb
module RechnerServiceModule
   InterfaceNS = 'http://tempuri.org/TestWS'
   Methods=[['TestWS', 'inputString']]

   def RechnerServiceModule.add_method(drv)
      Methods.each do |method, *param|
         drv.add_method_with_soapaction(method, InterfaceNS, *param)
      end
   end
end
-------------------------------------------------------------------------------

Looking at the wiredump I see that this is the SOAP XML sent (which
apparently is identical to the one .NET expects - on the TestWS web
page: http://78.136.25.213/Test/ws/Service.asmx?op=TestWS):

-------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8" ?><soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body>
<TestWS xmlns="http://tempuri.org/TestWS">
<inputString>testString</inputString> </TestWS>
</soap:Body></soap:Envelope>
-------------------------------------------------------------------------------

Unfortunately I keep on receiving an error, as you can see in the
response:

-------------------------------------------------------------------------------
HTTP/1.1 500 Internal Server Error
Date: Wed, 14 Oct 2009 13:07:26 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Content-Length: 433

<?xml version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Server
was unable to process request. ---&gt; Value cannot be null.
Parameter name: String</faultstring><detail
/></soap:Fault></soap:Body></soap:Envelope>

: Server was unable to process request. ---> Value cannot be null.
(SOAP::FaultError)
Parameter name: String

Process finished with exit code 1

-------------------------------------------------------------------------------

I tried the approach of generating the WSDL proxy, and this is the error
I received:

-------------------------------------------------------------------------------
wsdl2ruby.rb --wsdl http://78.136.25.213/Test/ws/Service.asmx?wsdl
--type client --force
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}binding
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}operation
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}body
ignored element: {http://schemas.xmlsoap.org/wsdl/soap12/}address
I, [2009-10-14T14:58:09.237427 #35258] INFO -- app: Creating class
definition.
I, [2009-10-14T14:58:09.237637 #35258] INFO -- app: Creates file
'default.rb'.
F, [2009-10-14T14:58:09.239160 #35258] FATAL -- app: Detected an
exception. Stopping ... undefined method `collect' for
"{http://tempuri.org/}TestWS\n inputString - SOAP::SOAPString":String
(NoMethodError)
/usr/lib/Ruby1.9/rubygems-1.3.5/gems/soap4r-1.5.8/lib/xsd/codegen/gensupport.rb:239:in
`trim_eol'
....
etc
-------------------------------------------------------------------------------

So, if anybody has the solution to this, I would really love to hear
that, since this is killing me now...

Thanks for the help!
--
Posted via http://www.ruby-forum.com/.

I guess nobody has the answer to this, hence nobody was able to make
soap4r working with .NET web services?
Anybody could please suggest me a working SOAP library for Ruby that
works for real with .NET ws?
Sure appreciated, thanks!

···

--
Posted via http://www.ruby-forum.com/.

I've been successful in using various wsdl's for communicating with some services which are also .NET based afaik. I've used wsdl2ruby.rb in all cases and it didn't fail on the wsdl's I've given it.

But I'd probably use this now if I need to write additional clients:

I'd suggest giving it a try to see if it fits your needs.

···

On 16 Oct 2009, at 11:55, Massimo Bensi wrote:

I guess nobody has the answer to this, hence nobody was able to make
soap4r working with .NET web services?
Anybody could please suggest me a working SOAP library for Ruby that
works for real with .NET ws?
Sure appreciated, thanks!

--
Regards,

Dirkjan Bussink

Sorry, for the delay. I also haved used soap4r successfully in the
past to talk to .net web services. After your initial post, I grabbed
your wsdl and ran it through wsdl2ruby, the result was the same as
yours: the request appeared identical to the sample request provided
by the web service but the response was parameter String cannot be
NULL.

I would recommend trying another library such as suggested by Dirkjan
Bussink. Also, are you certain that the service itself is not the
issue (e.g. it appears that the error references a parameter named
String but the request only has a parameter testString)?

···

On Fri, Oct 16, 2009 at 5:55 AM, Massimo Bensi <mbensi@spotzer.com> wrote:

I guess nobody has the answer to this, hence nobody was able to make
soap4r working with .NET web services?
Anybody could please suggest me a working SOAP library for Ruby that
works for real with .NET ws?
Sure appreciated, thanks!

unknown wrote:

I guess nobody has the answer to this, hence nobody was able to make
soap4r working with .NET web services?
Anybody could please suggest me a working SOAP library for Ruby that
works for real with .NET ws?
Sure appreciated, thanks!

Sorry, for the delay. I also haved used soap4r successfully in the
past to talk to .net web services. After your initial post, I grabbed
your wsdl and ran it through wsdl2ruby, the result was the same as
yours: the request appeared identical to the sample request provided
by the web service but the response was parameter String cannot be
NULL.

I would recommend trying another library such as suggested by Dirkjan
Bussink. Also, are you certain that the service itself is not the
issue (e.g. it appears that the error references a parameter named
String but the request only has a parameter testString)?

Thanks,

unknown: you were right, it was totally my fault!
I was too busy debugging this "new" (to me) Ruby library that I didn't
bother checking for issues in the web service.
Well, the problem was actually there..
Sorry about this, my bad.

Dirkjan: thank you much, I'll keep handsoap in mind in case I need
another soap library.

For now it works just fine with soap4r!
Thanks all!

···

On Fri, Oct 16, 2009 at 5:55 AM, Massimo Bensi <mbensi@spotzer.com> > wrote:

--
Posted via http://www.ruby-forum.com/\.

I did exactly what noisefree did but getting below error

Fast Debugger (ruby-debug-ide 0.4.6) listens on localhost:3509
JRuby limited openssl loaded. gem install jruby-openssl for full
support.
http://jruby.kenai.com/pages/JRuby_Builtin_OpenSSL
Wire dump:

opening connection to 192.168.24.76...
opened
<- “POST /BSSWebService/Test.asmx HTTP/1.1\r\nContent-Type: text/xml;
charset=utf-8\r\nSoapaction:
\“http://tempuri.org/MyName”\r\nUser-Agent: SOAP4R/1.5.5\r\nAccept:
*/*\r\nHost: 192.168.24.76\r\nContent-Length: 368\r\n\r\n”
<- "<?xml version=\“1.0\” encoding=\“utf-8\” ?>\n<env:Envelope
xmlns:xsi=\“http://www.w3.org/2001/XMLSchema-instance”\n
xmlns:xsd=\“http://www.w3.org/2001/XMLSchema”\n
xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/&quot;>\n <env:Body>\n
<n1:MyName xmlns:n1=\“http://tempuri.org/MyName&quot;>\n
<n1:inpstr>testString</n1:inpstr>\n </n1:MyName>\n
</env:Body>\n</env:Envelope>”
-> “HTTP/1.1 500 Internal Server Error\r\n”
-> “Date: Fri, 07 May 2010 18:28:15 GMT\r\n”
-> “Server: Microsoft-IIS/6.0\r\n”
-> “X-Powered-By: ASP.NET\r\n”
-> “X-AspNet-Version: 2.0.50727\r\n”
-> “Cache-Control: private\r\n”
-> “Content-Type: text/xml; charset=utf-8\r\n”
-> “Content-Length: 934\r\n”
-> "\r\n"
reading 934 bytes...
-> "<?xml version=\“1.0\” encoding=\“utf-8\”?><soap:Envelope
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/&quot;
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance&quot;
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema&quot;><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>System.Web.Services.Protocols.SoapException:
Server did not recognize the value of HTTP Header SOAPAction:
http://tempuri.org/MyName.\r\n at
System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()\r\n
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()\r\n
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type,
HttpContext context, HttpRequest request, HttpResponse response)\r\n
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type,
HttpContext context, HttpRequest request, HttpResponse response,
Boolean&amp; abortProcessing)</faultstring><detail
/></soap:Fault></soap:Body></soap:Envelope>"
read 934 bytes
Conn keep-alive
<?xml version=“1.0” encoding=“utf-8”?><soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd=“http://www.w3.org/2001/XMLSchema”><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>System.Web.Services.Protocols.SoapException:
Server did not recognize the value of HTTP Header SOAPAction:
http://tempuri.org/MyName.
   at
System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
   at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
   at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type,
HttpContext context, HttpRequest request, HttpResponse response)
   at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type
type, HttpContext context, HttpRequest request, HttpResponse response,
Boolean&amp; abortProcessing)</faultstring><detail
/></soap:Fault></soap:Body></soap:Envelope>

: System.Web.Services.Protocols.SoapException: Server did not recognize
the value of HTTP Header SOAPAction: http://tempuri.org/MyName.
(SOAP::FaultError)
   at
System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
   at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
   at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type,
HttpContext context, HttpRequest request, HttpResponse response)
   at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type
type, HttpContext context, HttpRequest request, HttpResponse response,
Boolean& abortProcessing)

What could be the problem

My code

module RechnerServiceModule
   InterfaceNS = 'http://tempuri.org/MyName'
   Methods=[['MyName','inpstr']]

   def RechnerServiceModule.add_method(drv)
      Methods.each do |method, *param|
         drv.add_method_with_soapaction(method, InterfaceNS, *param)

      end
   end
end
require 'rubygems'
require "soap/rpc/driver"
#require "RechnerServiceModule"
include RechnerServiceModule

server = 'http://192.168.24.76/BSSWebService/Test.asmx'
wiredump_dev=STDERR
service = SOAP::RPC::Driver.new(server,
RechnerServiceModule::InterfaceNS)
#service.use_default_namespace = true
service.default_encodingstyle =
SOAP::EncodingStyle::ASPDotNetHandler::Namespace
service.wiredump_dev=wiredump_dev
RechnerServiceModule::add_method(service)
result = service.MyName("testString")

print("Result: ", result)

···

--
Posted via http://www.ruby-forum.com/.

I'm not intimately familiar with this library, but I would be
interested to know if it works properly on a non-JRuby setup. If it
does, it would be a bug we would want to fix in JRuby. If it does not,
then it's probably an issue with the library...

···

On Fri, May 7, 2010 at 1:38 PM, David Maria <msrnivas@yahoo.com> wrote:

I did exactly what noisefree did but getting below error

Fast Debugger (ruby-debug-ide 0.4.6) listens on localhost:3509
JRuby limited openssl loaded. gem install jruby-openssl for full
support.
http://jruby.kenai.com/pages/JRuby_Builtin_OpenSSL
Wire dump:

opening connection to 192.168.24.76...
opened
<- "POST /BSSWebService/Test.asmx HTTP/1.1\r\nContent-Type: text/xml;
charset=utf-8\r\nSoapaction:
\"Bing“\r\nUser-Agent: SOAP4R/1.5.5\r\nAccept:
*/*\r\nHost: 192.168.24.76\r\nContent-Length: 368\r\n\r\n"
<- "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<env:Envelope
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\”\n
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n
xmlns:env=\"Error <env:Body>\n
<n1:MyName xmlns:n1=\"Bing
<n1:inpstr>testString</n1:inpstr>\n </n1:MyName>\n
</env:Body>\n</env:Envelope>"
-> "HTTP/1.1 500 Internal Server Error\r\n"
-> "Date: Fri, 07 May 2010 18:28:15 GMT\r\n"
-> "Server: Microsoft-IIS/6.0\r\n"
-> "X-Powered-By: ASP.NET\r\n"
-> "X-AspNet-Version: 2.0.50727\r\n"
-> "Cache-Control: private\r\n"
-> "Content-Type: text/xml; charset=utf-8\r\n"
-> "Content-Length: 934\r\n"
-> "\r\n"
reading 934 bytes...
-> "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope
xmlns:soap=\"Error;
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\&quot;
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\&quot;&gt;&lt;soap:Body&gt;&lt;soap:Fault&gt;&lt;faultcode&gt;soap:Client&lt;/faultcode&gt;&lt;faultstring&gt;System\.Web\.Services\.Protocols\.SoapException:
Server did not recognize the value of HTTP Header SOAPAction:
Bing at
System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()\r\n
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()\r\n
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type,
HttpContext context, HttpRequest request, HttpResponse response)\r\n
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type,
HttpContext context, HttpRequest request, HttpResponse response,
Boolean& abortProcessing)</faultstring><detail
/></soap:Fault></soap:Body></soap:Envelope>"
read 934 bytes
Conn keep-alive
<?xml version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:soap="Error;
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot;
xmlns:xsd="http://www.w3.org/2001/XMLSchema&quot;&gt;&lt;soap:Body&gt;&lt;soap:Fault&gt;&lt;faultcode&gt;soap:Client&lt;/faultcode&gt;&lt;faultstring&gt;System\.Web\.Services\.Protocols\.SoapException:
Server did not recognize the value of HTTP Header SOAPAction:
Bing.
at
System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type,
HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type
type, HttpContext context, HttpRequest request, HttpResponse response,
Boolean& abortProcessing)</faultstring><detail
/></soap:Fault></soap:Body></soap:Envelope>

: System.Web.Services.Protocols.SoapException: Server did not recognize
the value of HTTP Header SOAPAction: Bing.
(SOAP::FaultError)
at
System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type,
HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type
type, HttpContext context, HttpRequest request, HttpResponse response,
Boolean& abortProcessing)

What could be the problem

My code

module RechnerServiceModule
InterfaceNS = 'Bing;
Methods=[['MyName','inpstr']]

def RechnerServiceModule.add_method(drv)
Methods.each do |method, *param|
drv.add_method_with_soapaction(method, InterfaceNS, *param)

 end

end
end
require 'rubygems'
require "soap/rpc/driver"
#require "RechnerServiceModule"
include RechnerServiceModule

server = 'http://192.168.24.76/BSSWebService/Test.asmx&#39;
wiredump_dev=STDERR
service = SOAP::RPC::Driver.new(server,
RechnerServiceModule::InterfaceNS)
#service.use_default_namespace = true
service.default_encodingstyle =
SOAP::EncodingStyle::ASPDotNetHandler::Namespace
service.wiredump_dev=wiredump_dev
RechnerServiceModule::add_method(service)
result = service.MyName("testString")

print("Result: ", result)
--
Posted via http://www.ruby-forum.com/\.