URL rewriting of wsdl includes
thomas.diesler Mar 23, 2005 5:30 AMHi folks,
this thread is about the URLs that we rewrite in the wsdl for wsdl imports and schema includes. Lets look at JIRA issue JBWS-153 for this discussion
The wsdl uses
<wsdl:types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.dis-corp.com/xml/2005/ebiz"> <xsd:include schemaLocation="schemas/get/Get.xsd"/> </xsd:schema> </wsdl:types>
The wsdl is obtained through URL
http://satellite:8080/ws4ee-jbws153/Order?wsdl
and the include is rewritten as
<wsdl:types> <xsd:schema targetNamespace="http://www.dis-corp.com/xml/2005/ebiz" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:include schemaLocation="/ws4ee-jbws153/Order?wsdl&resource=schemas/get/Get.xsd"/> </xsd:schema> </wsdl:types>
which VB.net does not understand.
The issue is that the schemaLocation cannot be simply treated as relative URL because it results in
http://satellite:8080/ws4ee-jbws153/schemas/get/Get.xsd
which is obviously invalid.
A solution recently suggested on the forums uses a predefined URL path to obtain the wsdl and its included artifacts, like this:
http://satellite:8080/ws4ee-jbws153/Order/wsdl
for the wsdl, and hence
http://satellite:8080/ws4ee-jbws153/Order/schemas/get/Get.xsd
for the included schema.
The problem with this is that the web.xml defines the servlet mapping as
<servlet-mapping> <servlet-name>Order</servlet-name> <url-pattern>/Order</url-pattern> </servlet-mapping>
and not as
<servlet-mapping> <servlet-name>Order</servlet-name> <url-pattern>/Order/*</url-pattern> </servlet-mapping>
which BTW is disallowed by the WS4EE spec.
The URL
http://satellite:8080/ws4ee-jbws153/Order/schemas/get/Get.xsd
is invalid and will not be redirected to the ServiceEndpointServlet for schema delivery to the client.
Ok, we rewrite the web.xml anyway and might want to append the missing /*. Changeing .../Order?wsdl to .../Order/wsdl would break all clients which should not be done lilght heartedly.
I seek your feedback on this "rewrite issue". Is there any possible way of avoiding complex parameter lists, which are not supported by .NET? How do other stacks do it?