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!" [EMAIL PROTECTED] Russell Butek/Austin/IBM@IBMUS on 03/29/2002 02:01:36 PM Please respond to [EMAIL PROTECTED] To: [EMAIL PROTECTED] 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 [EMAIL PROTECTED] Rick Rineholt/Raleigh/IBM@IBMUS on 03/29/2002 12:36:43 PM Please respond to [EMAIL PROTECTED] To: [EMAIL PROTECTED] 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!" [EMAIL PROTECTED] Russell Butek/Austin/IBM@IBMUS on 03/29/2002 11:26:50 AM Please respond to [EMAIL PROTECTED] To: [EMAIL PROTECTED] 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 [EMAIL PROTECTED] Rick Rineholt/Raleigh/IBM@IBMUS on 03/29/2002 09:20:30 AM Please respond to [EMAIL PROTECTED] To: [EMAIL PROTECTED] 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!" [EMAIL PROTECTED] Davanum Srinivas <[EMAIL PROTECTED]> on 03/26/2002 03:06:00 PM Please respond to [EMAIL PROTECTED] To: [EMAIL PROTECTED] cc: Subject: Re: client.Service getCall() Please see enclosed WSDL and Main.java. Thanks, dims --- Davanum Srinivas <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> on 03/26/2002 07:50:25 AM > > > > Please respond to [EMAIL PROTECTED] > > > > To: [EMAIL PROTECTED] > > 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> on 03/26/2002 07:36:06 AM > > > > > > Please respond to [EMAIL PROTECTED] > > > > > > To: Rick Rineholt/Raleigh/IBM@IBMUS > > > cc: [EMAIL PROTECTED] > > > 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 <[EMAIL PROTECTED]> 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!" > > > > > > > > [EMAIL PROTECTED] > > > > > > > > > > > > > ===== > > > 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:<ol><li>Beginner</li> <li>Intermediate</li><li>Advanced</li> </ol></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:<ol> <li>Beginner</li><li>Intermediate</li> <li>Advanced</li></ol></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. <p>Topic IDs are:<ol><li>General</li> <li>Web Forms</li><li>Server Controls</li> <li>Data Binding</li><li>Advanced Techniques</li><li>Web Services</li> <li>Custom ASP.NET Components</li><li>ASP to ASP.NET Migration</li><li>COM+</li><li>Mobile Web Forms</li></ol></p><p>Levels indicated in the result set are:<ol><li>Beginner</li> <li>Intermediate</li><li>Advanced</li> </ol></p></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:<ol> <li>Beginner</li><li>Intermediate</li> <li>Advanced</li></ol></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:<ol><li>Beginner</li> <li>Intermediate</li><li>Advanced</li> </ol></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:<ol> <li>Beginner</li><li>Intermediate</li> <li>Advanced</li></ol></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. <p>Topic IDs are:<ol><li>General</li> <li>Web Forms</li><li>Server Controls</li> <li>Data Binding</li><li>Advanced Techniques</li><li>Web Services</li> <li>Custom ASP.NET Components</li><li>ASP to ASP.NET Migration</li><li>COM+</li><li>Mobile Web Forms</li></ol></p><p>Levels indicated in the result set are:<ol><li>Beginner</li> <li>Intermediate</li><li>Advanced</li> </ol></p></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:<ol> <li>Beginner</li><li>Intermediate</li> <li>Advanced</li></ol></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:<ol><li>Beginner</li> <li>Intermediate</li><li>Advanced</li> </ol></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:<ol> <li>Beginner</li><li>Intermediate</li> <li>Advanced</li></ol></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. <p>Topic IDs are:<ol><li>General</li>