axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rick Rineholt" <rineh...@us.ibm.com>
Subject Re: client.Service getCall()
Date Fri, 29 Mar 2002 21:47:28 GMT
One item that "might" be broken from my understanding of the code;
 and I'd test it first in case I've missed something, is that the "session"
logic
 I think its maintained  by cookies that are kept in the MessageContext
which
is stored in the Call object.  Creating a new Call object every time I
think its
going to get lost.

Rick Rineholt
"The truth is out there...  All you need is a better search engine!"

rineholt@us.ibm.com



Russell Butek/Austin/IBM@IBMUS on 03/29/2002 02:01:36 PM

Please respond to axis-dev@xml.apache.org

To:    axis-dev@xml.apache.org
cc:
Subject:    Re: client.Service getCall()



JAX-RPC does not dictate stub thread safety.  Users dictate it.  Before the
stub was thread-safe we had at least one axis-user post complaining that it
wasn't safe.  Granted, one user isn't much.  BUT, based on WebSphere
experience with CORBA stubs, thread-safety at the stub level is critical in
complex systems.

There's always a cost associated with thread safety, but shortly before we
decided to be thread safe, Sam told me that he and Doug made an effort to
make Call object instantiation as cheap as possible.  That's why I decided
on this approach.  If we can come up with another, cheaper, way to make the
stubs thread-safe then I'm all for it.  Perhaps we should cache each
method's Call object?  Setting properties would be a bit more expensive
since they'd have to be set on ALL Call objects, but setting properties
isn't something that occurs all that often.  Any other ideas?

Russell Butek
butek@us.ibm.com


Rick Rineholt/Raleigh/IBM@IBMUS on 03/29/2002 12:36:43 PM

Please respond to axis-dev@xml.apache.org

To:    axis-dev@xml.apache.org
cc:
Subject:    Re: client.Service getCall()



one question is still is what is mandating that these objects be
 thread safe?  Is it JAX-RPC ?  If so then please point it out  to me
 and ignore any of the following.

If NOTHING is and we can do it at no cost great!
It is my opinion that the most likely useage of a  stub is somethng that
 is created on one thread  has potentially many methods called on it
by that thread
 and then is gotten rid of..  Even in multi-theaded programs it is rare to
share many objects between threads.  I would  bet it would be the
 rare case that would be a remote object.  Mind you I'm not saying it
 would NEVER occur, in those cases let the user of the Stub provide
 the serialization and incur the cost.  But in the most typical case where
I'm
 a single thread making many calls I am paying the price of creating
a "Call" object for every invocation.  Taking just a preliminary look
 at the CALL object, it looks much more heavy weight than the Stub
is especially
if the Stub were NOT thread safe and methods on it could call a Call
object directly minus the need to do any synchronization or requiring
the use theadlocal objects, caching options etc.

In short,  I'm questioning if this is not mandatory (which case
 you shouldn't need to be reading this :-) and we can just document
that these object are not thread safe,   we are paying a higher
cost than necessary for an a typical usage pattern.

Rick Rineholt
"The truth is out there...  All you need is a better search engine!"

rineholt@us.ibm.com



Russell Butek/Austin/IBM@IBMUS on 03/29/2002 11:26:50 AM

Please respond to axis-dev@xml.apache.org

To:    axis-dev@xml.apache.org
cc:
Subject:    Re: client.Service getCall()



The stubs are threadsafe wrt invocations.  You've brought up that they're
not wrt properties.  But I don't believe it's possible to make a stub
threadsafe wrt properties from INSIDE the stub.  That's something that the
stub caller must do.  (This is essentially the reason why we instantiate a
new Call object for each invocation, because there are things we do in the
stub to the Call object that cannot be made thread-safe from within the
Call object.)  Even if the stub extended Call, this same issue would still
exist (and we'd break the current level of thread safety, I think).

Russell Butek
butek@us.ibm.com


Rick Rineholt/Raleigh/IBM@IBMUS on 03/29/2002 09:20:30 AM

Please respond to axis-dev@xml.apache.org

To:    axis-dev@xml.apache.org
cc:
Subject:    Re: client.Service getCall()



had a chance to very briefly  look at this and  here are my thoughts:
The problem stems that functions are needed from the "call" object which is
not generally
exposed by the client Stub object, and the need to make the Stub thread
safe.

- As I think we've all agreed if needed this needs to be moved up to the
Stub where the issue lies.
-I've scanned JAX-RPC spec and the only reference I see with regard
 to multi-threading is that serialzer and deserializer need to be thread
safe to allow them to be
 by multiple threads.

Question: Are we claiming that Stubs, Locator , Service and Call object are
thread safe?
 Can these objects be created on one thread and used on another?
Simultaneously?

If yes, from what I can tell there is more work to be done (i.e.
client.Stub where setUsername,
setTimeout, setMaintainSession etc could all be set  by one thread and
before a call is made
on that thread another thread could change these)

If these objects should only be used on a single thread then couldn't the
call object be cached and
retrieved from a private variable and not threadlocal?

Can org.apache.axis.client.Stub not extend the org.apache.axis.client.Call
object and
instead of creating a new one every time just reuse its logic?

That would change String xml = locator.getCall().getResponseMessage
().getSOAPPart().getAsString();
to      soap.getResponseMessage().getSOAPPart().getAsString  //looks more
natural.
I have not looked at this idea in depth, but just offer it in case it may
be helpful.  I really don't
know all the implications of this (Caveat Emptor :-) (one side affect is
that the Stub would
probably not be thread safe unless Call is made to be :-( ).


Some un-related observations:
Couldnt the firstCall logic be moved up into the generated class and made
to be static so that
the registration is done only once ever?
Why not byte the bullet and assume the call will be made and create a fake
call in constructor
and do one time TypeMappingRegistry registration there?
In any case I think some of the vectors like cachedSerClasses be set to
null after the firstCall.

Sorry, but there are probably no great revelations here.



Rick Rineholt
"The truth is out there...  All you need is a better search engine!"

rineholt@us.ibm.com



Davanum Srinivas <dims@yahoo.com> on 03/26/2002 03:06:00 PM

Please respond to axis-dev@xml.apache.org

To:    axis-dev@xml.apache.org
cc:
Subject:    Re: client.Service getCall()



Please see enclosed WSDL and Main.java.

Thanks,
dims

--- Davanum Srinivas <dims@yahoo.com> wrote:
> Dug, Rick,
>
> Am open to alternative(s). Please run WSDL2Java on the WSDL and let me
know where this support
> should be added.
>
> Thanks,
> dims
>
> --- Doug Davis <dug@us.ibm.com> wrote:
> > It seems like a cleaner solution would have been to have the stubs
> > manage this for you rather than the Sevice object since, as Rick
> > pointed out, in a multithreaded scenario this could get really
> > messy.
> > -Dug
> >
> >
> > Davanum Srinivas <dims@yahoo.com> on 03/26/2002 07:50:25 AM
> >
> > Please respond to axis-dev@xml.apache.org
> >
> > To:    axis-dev@xml.apache.org
> > cc:
> > Subject:    Re: client.Service getCall()
> >
> >
> >
> > Dug,
> >
> > I think i mentioned it. I want WSDL2Java to generate code and i want to
use
> > JUST the generated
> > code!!!
> >
> > Thanks,
> > dims
> >
> > --- Doug Davis <dug@us.ibm.com> wrote:
> > > I'm confused - if you need access to the response XML, why not just
ask
> > the
> > > Call object (or its message context) for the response message.  Why
does
> > > the Service object need to be involved at all?
> > > -Dug
> > >
> > > Davanum Srinivas <dims@yahoo.com> on 03/26/2002 07:36:06 AM
> > >
> > > Please respond to axis-dev@xml.apache.org
> > >
> > > To:    Rick Rineholt/Raleigh/IBM@IBMUS
> > > cc:    axis-dev@xml.apache.org
> > > Subject:    Re: client.Service getCall()
> > >
> > >
> > >
> > > Rick,
> > >
> > > Here's the scenario where i NEED this (See enclosed WSDL and
Main.java
> > for
> > > running the generated
> > > stub). The problem is that when AXIS fails to convert the SOAP
Response
> > XML
> > > into Java objects...I
> > > need access to the Response XML itself!!!. Right now this is not
possible
> > > any other way. If
> > > there's a better way to do this, please let me know and we can get
rid of
> > > this UGLY hack.
> > >
> > > Thanks,
> > > dims
> > >
> > > --- Rick Rineholt <rineholt@us.ibm.com> wrote:
> > > > Davanum,
> > > > I would like to get your thinking about this method and why the
need
> > for
> > > > this functionality in the client.Service object.  If presumably the
> > > caller
> > > > did the createCall, I would think it would be possible for it to
cache
> > > this
> > > > call object away and not have the client.Service object do this.
Doing
> > > > this has a negative consequence if lets say your an axis handler
that
> > > wants
> > > > make soap calls using this client api.  The Servlet engine
may/will be
> > > > calling you on many POOLED threads and caching this in the thread
> > object
> > > > means that garbage collection will never be called util that thread
is
> > > used
> > > > by the server again AND it makes another createCall call to replace
it.
> > > > IMO this is a very bad side effect that I don't think is very
desirable
> > > for
> > > > a functionality that the caller could  presumably do and be
cognizant
> > of
> > > > its side effects.
> > > >
> > > > Rick Rineholt
> > > > "The truth is out there...  All you need is a better search
engine!"
> > > >
> > > > rineholt@us.ibm.com
> > > >
> > >
> > >
> > > =====
> > > Davanum Srinivas - http://xml.apache.org/~dims/
> > >
> > > __________________________________________________
> > > Do You Yahoo!?
> > > Yahoo! Movies - coverage of the 74th Academy Awards®
> > > http://movies.yahoo.com/
> > >
> > >
> >
> >
> > =====
> > Davanum Srinivas - http://xml.apache.org/~dims/
> >
> > __________________________________________________
> > Do You Yahoo!?
> > Yahoo! Movies - coverage of the 74th Academy Awards®
> > http://movies.yahoo.com/
> >
> >
>
>
> =====
> Davanum Srinivas - http://xml.apache.org/~dims/
>
> __________________________________________________
> Do You Yahoo!?
> Yahoo! Movies - coverage of the 74th Academy Awards®
> http://movies.yahoo.com/


=====
Davanum Srinivas - http://xml.apache.org/~dims/

__________________________________________________
Do You Yahoo!?
Yahoo! Movies - coverage of the 74th Academy Awards®
http://movies.yahoo.com/
<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap
="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="
http://www.w3.org/2001/XMLSchema" xmlns:s0="http://www.dotnetjunkies.com"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="
http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="
http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="
http://www.dotnetjunkies.com" xmlns="http://schemas.xmlsoap.org/wsdl/">
  <types>
    <s:schema elementFormDefault="qualified" targetNamespace="
    http://www.dotnetjunkies.com">
      <s:import namespace="http://www.w3.org/2001/XMLSchema" />
      <s:element name="GetNewsSummary">
        <s:complexType />
      </s:element>
      <s:element name="GetNewsSummaryResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name
              ="GetNewsSummaryResult">
              <s:complexType>
                <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetNewsSummary2">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="tableName" type
          ="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetNewsSummary2Response">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name
              ="GetNewsSummary2Result">
              <s:complexType>
                <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetTutorialsSummary">
        <s:complexType />
      </s:element>
      <s:element name="GetTutorialsSummaryResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name
              ="GetTutorialsSummaryResult">
              <s:complexType>
                <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetTutorialsSummary2">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="tableName" type
          ="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetTutorialsSummary2Response">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name
              ="GetTutorialsSummary2Result">
              <s:complexType>
                <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetTutorialsSummaryByTopic">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="topicID" type
            ="s:int" />
            <s:element minOccurs="0" maxOccurs="1" name="tableName" type
            ="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetTutorialsSummaryByTopicResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name
              ="GetTutorialsSummaryByTopicResult">
              <s:complexType>
                <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="Get4NewestTutorialsSummary">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="tableName" type
          ="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="Get4NewestTutorialsSummaryResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name
              ="Get4NewestTutorialsSummaryResult">
              <s:complexType>
                <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetFAQ">
        <s:complexType />
      </s:element>
      <s:element name="GetFAQResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetFAQResult">
              <s:complexType>
                <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetFAQ2">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="tableName" type
          ="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="GetFAQ2Response">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetFAQ2Result">
              <s:complexType>
                <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="DataSet" nillable="true">
        <s:complexType>
          <s:sequence>
                  <!--
                  <s:element ref="s:schema" />
                  -->
            <s:any />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </types>
  <message name="GetNewsSummarySoapIn">
    <part name="parameters" element="s0:GetNewsSummary" />
  </message>
  <message name="GetNewsSummarySoapOut">
    <part name="parameters" element="s0:GetNewsSummaryResponse" />
  </message>
  <message name="GetNewsSummary2SoapIn">
    <part name="parameters" element="s0:GetNewsSummary2" />
  </message>
  <message name="GetNewsSummary2SoapOut">
    <part name="parameters" element="s0:GetNewsSummary2Response" />
  </message>
  <message name="GetTutorialsSummarySoapIn">
    <part name="parameters" element="s0:GetTutorialsSummary" />
  </message>
  <message name="GetTutorialsSummarySoapOut">
    <part name="parameters" element="s0:GetTutorialsSummaryResponse" />
  </message>
  <message name="GetTutorialsSummary2SoapIn">
    <part name="parameters" element="s0:GetTutorialsSummary2" />
  </message>
  <message name="GetTutorialsSummary2SoapOut">
    <part name="parameters" element="s0:GetTutorialsSummary2Response" />
  </message>
  <message name="GetTutorialsSummaryByTopicSoapIn">
    <part name="parameters" element="s0:GetTutorialsSummaryByTopic" />
  </message>
  <message name="GetTutorialsSummaryByTopicSoapOut">
    <part name="parameters" element="s0:GetTutorialsSummaryByTopicResponse"
  />
  </message>
  <message name="Get4NewestTutorialsSummarySoapIn">
    <part name="parameters" element="s0:Get4NewestTutorialsSummary" />
  </message>
  <message name="Get4NewestTutorialsSummarySoapOut">
    <part name="parameters" element="s0:Get4NewestTutorialsSummaryResponse"
  />
  </message>
  <message name="GetFAQSoapIn">
    <part name="parameters" element="s0:GetFAQ" />
  </message>
  <message name="GetFAQSoapOut">
    <part name="parameters" element="s0:GetFAQResponse" />
  </message>
  <message name="GetFAQ2SoapIn">
    <part name="parameters" element="s0:GetFAQ2" />
  </message>
  <message name="GetFAQ2SoapOut">
    <part name="parameters" element="s0:GetFAQ2Response" />
  </message>
  <message name="GetNewsSummaryHttpGetIn" />
  <message name="GetNewsSummaryHttpGetOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetNewsSummary2HttpGetIn">
    <part name="tableName" type="s:string" />
  </message>
  <message name="GetNewsSummary2HttpGetOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetTutorialsSummaryHttpGetIn" />
  <message name="GetTutorialsSummaryHttpGetOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetTutorialsSummary2HttpGetIn">
    <part name="tableName" type="s:string" />
  </message>
  <message name="GetTutorialsSummary2HttpGetOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetTutorialsSummaryByTopicHttpGetIn">
    <part name="topicID" type="s:string" />
    <part name="tableName" type="s:string" />
  </message>
  <message name="GetTutorialsSummaryByTopicHttpGetOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="Get4NewestTutorialsSummaryHttpGetIn">
    <part name="tableName" type="s:string" />
  </message>
  <message name="Get4NewestTutorialsSummaryHttpGetOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetFAQHttpGetIn" />
  <message name="GetFAQHttpGetOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetFAQ2HttpGetIn">
    <part name="tableName" type="s:string" />
  </message>
  <message name="GetFAQ2HttpGetOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetNewsSummaryHttpPostIn" />
  <message name="GetNewsSummaryHttpPostOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetNewsSummary2HttpPostIn">
    <part name="tableName" type="s:string" />
  </message>
  <message name="GetNewsSummary2HttpPostOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetTutorialsSummaryHttpPostIn" />
  <message name="GetTutorialsSummaryHttpPostOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetTutorialsSummary2HttpPostIn">
    <part name="tableName" type="s:string" />
  </message>
  <message name="GetTutorialsSummary2HttpPostOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetTutorialsSummaryByTopicHttpPostIn">
    <part name="topicID" type="s:string" />
    <part name="tableName" type="s:string" />
  </message>
  <message name="GetTutorialsSummaryByTopicHttpPostOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="Get4NewestTutorialsSummaryHttpPostIn">
    <part name="tableName" type="s:string" />
  </message>
  <message name="Get4NewestTutorialsSummaryHttpPostOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetFAQHttpPostIn" />
  <message name="GetFAQHttpPostOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <message name="GetFAQ2HttpPostIn">
    <part name="tableName" type="s:string" />
  </message>
  <message name="GetFAQ2HttpPostOut">
    <part name="Body" element="s0:DataSet" />
  </message>
  <portType name="ContentServicesSoap">
    <operation name="GetNewsSummary">
      <documentation>Returns a DataSet with one DataTable (News).  The
      DataTable contains summaries for all News articles in the past 14
      days in the database ordered by SubDate descending.</documentation>
      <input message="s0:GetNewsSummarySoapIn" />
      <output message="s0:GetNewsSummarySoapOut" />
    </operation>
    <operation name="GetNewsSummary2">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all News
      articles in the past 14 days in the database ordered by SubDate
      descending.</documentation>
      <input message="s0:GetNewsSummary2SoapIn" />
      <output message="s0:GetNewsSummary2SoapOut" />
    </operation>
    <operation name="GetTutorialsSummary">
      <documentation>Returns a DataSet with one DataTable (Tutorials).  The
      DataTable contains summaries for all tutorials in the database
      ordered by SubDate descending. Levels indicated in the result set
      are:&lt;ol&gt;&lt;li&gt;Beginner&lt;/li&gt;
      &lt;li&gt;Intermediate&lt;/li&gt;&lt;li&gt;Advanced&lt;/li&gt;
      &lt;/ol&gt;</documentation>
      <input message="s0:GetTutorialsSummarySoapIn" />
      <output message="s0:GetTutorialsSummarySoapOut" />
    </operation>
    <operation name="GetTutorialsSummary2">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all
      tutorials in the database ordered by SubDate descending. Levels
      indicated in the result set are:&lt;ol&gt;
      &lt;li&gt;Beginner&lt;/li&gt;&lt;li&gt;Intermediate&lt;/li&gt;
      &lt;li&gt;Advanced&lt;/li&gt;&lt;/ol&gt;</documentation>
      <input message="s0:GetTutorialsSummary2SoapIn" />
      <output message="s0:GetTutorialsSummary2SoapOut" />
    </operation>
    <operation name="GetTutorialsSummaryByTopic">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all
      tutorials of the specified topicID ordered by SubDate descending.
      &lt;p&gt;Topic IDs are:&lt;ol&gt;&lt;li&gt;General&lt;/li&gt;
      &lt;li&gt;Web Forms&lt;/li&gt;&lt;li&gt;Server Controls&lt;/li&gt;
      &lt;li&gt;Data Binding&lt;/li&gt;&lt;li&gt;Advanced
      Techniques&lt;/li&gt;&lt;li&gt;Web Services&lt;/li&gt;
      &lt;li&gt;Custom ASP.NET Components&lt;/li&gt;&lt;li&gt;ASP
to
      ASP.NET Migration&lt;/li&gt;&lt;li&gt;COM+&lt;/li&gt;&lt;li&gt;Mobile
      Web Forms&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;Levels
indicated in
      the result set are:&lt;ol&gt;&lt;li&gt;Beginner&lt;/li&gt;
      &lt;li&gt;Intermediate&lt;/li&gt;&lt;li&gt;Advanced&lt;/li&gt;
      &lt;/ol&gt;&lt;/p&gt;</documentation>
      <input message="s0:GetTutorialsSummaryByTopicSoapIn" />
      <output message="s0:GetTutorialsSummaryByTopicSoapOut" />
    </operation>
    <operation name="Get4NewestTutorialsSummary">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for the four
      (4) newset tutorials in the database ordered by SubDate
      descending.Levels indicated in the result set are:&lt;ol&gt;
      &lt;li&gt;Beginner&lt;/li&gt;&lt;li&gt;Intermediate&lt;/li&gt;
      &lt;li&gt;Advanced&lt;/li&gt;&lt;/ol&gt;</documentation>
      <input message="s0:Get4NewestTutorialsSummarySoapIn" />
      <output message="s0:Get4NewestTutorialsSummarySoapOut" />
    </operation>
    <operation name="GetFAQ">
      <documentation>Returns a DataSet with one DataTable (FAQs) of .NET
      FAQs and answers.</documentation>
      <input message="s0:GetFAQSoapIn" />
      <output message="s0:GetFAQSoapOut" />
    </operation>
    <operation name="GetFAQ2">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter of .NET FAQs and answers.</documentation>
      <input message="s0:GetFAQ2SoapIn" />
      <output message="s0:GetFAQ2SoapOut" />
    </operation>
  </portType>
  <portType name="ContentServicesHttpGet">
    <operation name="GetNewsSummary">
      <documentation>Returns a DataSet with one DataTable (News).  The
      DataTable contains summaries for all News articles in the past 14
      days in the database ordered by SubDate descending.</documentation>
      <input message="s0:GetNewsSummaryHttpGetIn" />
      <output message="s0:GetNewsSummaryHttpGetOut" />
    </operation>
    <operation name="GetNewsSummary2">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all News
      articles in the past 14 days in the database ordered by SubDate
      descending.</documentation>
      <input message="s0:GetNewsSummary2HttpGetIn" />
      <output message="s0:GetNewsSummary2HttpGetOut" />
    </operation>
    <operation name="GetTutorialsSummary">
      <documentation>Returns a DataSet with one DataTable (Tutorials).  The
      DataTable contains summaries for all tutorials in the database
      ordered by SubDate descending. Levels indicated in the result set
      are:&lt;ol&gt;&lt;li&gt;Beginner&lt;/li&gt;
      &lt;li&gt;Intermediate&lt;/li&gt;&lt;li&gt;Advanced&lt;/li&gt;
      &lt;/ol&gt;</documentation>
      <input message="s0:GetTutorialsSummaryHttpGetIn" />
      <output message="s0:GetTutorialsSummaryHttpGetOut" />
    </operation>
    <operation name="GetTutorialsSummary2">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all
      tutorials in the database ordered by SubDate descending. Levels
      indicated in the result set are:&lt;ol&gt;
      &lt;li&gt;Beginner&lt;/li&gt;&lt;li&gt;Intermediate&lt;/li&gt;
      &lt;li&gt;Advanced&lt;/li&gt;&lt;/ol&gt;</documentation>
      <input message="s0:GetTutorialsSummary2HttpGetIn" />
      <output message="s0:GetTutorialsSummary2HttpGetOut" />
    </operation>
    <operation name="GetTutorialsSummaryByTopic">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all
      tutorials of the specified topicID ordered by SubDate descending.
      &lt;p&gt;Topic IDs are:&lt;ol&gt;&lt;li&gt;General&lt;/li&gt;
      &lt;li&gt;Web Forms&lt;/li&gt;&lt;li&gt;Server Controls&lt;/li&gt;
      &lt;li&gt;Data Binding&lt;/li&gt;&lt;li&gt;Advanced
      Techniques&lt;/li&gt;&lt;li&gt;Web Services&lt;/li&gt;
      &lt;li&gt;Custom ASP.NET Components&lt;/li&gt;&lt;li&gt;ASP
to
      ASP.NET Migration&lt;/li&gt;&lt;li&gt;COM+&lt;/li&gt;&lt;li&gt;Mobile
      Web Forms&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;Levels
indicated in
      the result set are:&lt;ol&gt;&lt;li&gt;Beginner&lt;/li&gt;
      &lt;li&gt;Intermediate&lt;/li&gt;&lt;li&gt;Advanced&lt;/li&gt;
      &lt;/ol&gt;&lt;/p&gt;</documentation>
      <input message="s0:GetTutorialsSummaryByTopicHttpGetIn" />
      <output message="s0:GetTutorialsSummaryByTopicHttpGetOut" />
    </operation>
    <operation name="Get4NewestTutorialsSummary">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for the four
      (4) newset tutorials in the database ordered by SubDate
      descending.Levels indicated in the result set are:&lt;ol&gt;
      &lt;li&gt;Beginner&lt;/li&gt;&lt;li&gt;Intermediate&lt;/li&gt;
      &lt;li&gt;Advanced&lt;/li&gt;&lt;/ol&gt;</documentation>
      <input message="s0:Get4NewestTutorialsSummaryHttpGetIn" />
      <output message="s0:Get4NewestTutorialsSummaryHttpGetOut" />
    </operation>
    <operation name="GetFAQ">
      <documentation>Returns a DataSet with one DataTable (FAQs) of .NET
       FAQs and answers.</documentation>
      <input message="s0:GetFAQHttpGetIn" />
      <output message="s0:GetFAQHttpGetOut" />
    </operation>
    <operation name="GetFAQ2">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter of .NET FAQs and answers.</documentation>
      <input message="s0:GetFAQ2HttpGetIn" />
      <output message="s0:GetFAQ2HttpGetOut" />
    </operation>
  </portType>
  <portType name="ContentServicesHttpPost">
    <operation name="GetNewsSummary">
      <documentation>Returns a DataSet with one DataTable (News).  The
      DataTable contains summaries for all News articles in the past 14
      days in the database ordered by SubDate descending.</documentation>
      <input message="s0:GetNewsSummaryHttpPostIn" />
      <output message="s0:GetNewsSummaryHttpPostOut" />
    </operation>
    <operation name="GetNewsSummary2">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all News
      articles in the past 14 days in the database ordered by SubDate
      descending.</documentation>
      <input message="s0:GetNewsSummary2HttpPostIn" />
      <output message="s0:GetNewsSummary2HttpPostOut" />
    </operation>
    <operation name="GetTutorialsSummary">
      <documentation>Returns a DataSet with one DataTable (Tutorials).  The
      DataTable contains summaries for all tutorials in the database
      ordered by SubDate descending. Levels indicated in the result set
      are:&lt;ol&gt;&lt;li&gt;Beginner&lt;/li&gt;
      &lt;li&gt;Intermediate&lt;/li&gt;&lt;li&gt;Advanced&lt;/li&gt;
      &lt;/ol&gt;</documentation>
      <input message="s0:GetTutorialsSummaryHttpPostIn" />
      <output message="s0:GetTutorialsSummaryHttpPostOut" />
    </operation>
    <operation name="GetTutorialsSummary2">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all
      tutorials in the database ordered by SubDate descending. Levels
      indicated in the result set are:&lt;ol&gt;
      &lt;li&gt;Beginner&lt;/li&gt;&lt;li&gt;Intermediate&lt;/li&gt;
      &lt;li&gt;Advanced&lt;/li&gt;&lt;/ol&gt;</documentation>
      <input message="s0:GetTutorialsSummary2HttpPostIn" />
      <output message="s0:GetTutorialsSummary2HttpPostOut" />
    </operation>
    <operation name="GetTutorialsSummaryByTopic">
      <documentation>Returns a DataSet with one DataTable named from the
      tableName parameter.  The DataTable contains summaries for all
      tutorials of the specified topicID ordered by SubDate descending.
      &lt;p&gt;Topic IDs are:&lt;ol&gt;&lt;li&gt;General&lt;/li&gt;







Mime
View raw message