Read WebService List<> data

Discussion in 'ASP .Net' started by Peter, Oct 9, 2008.

  1. Peter

    Peter Guest

    I have a WebService which returns a List of RunningReport class
    How do I read this XML data on the client side. How do I convert
    List<RunningReport> from the WebService side to List<RunningReport> on the
    client side

    I have tried the following:

    List<RunningReport> reportList = null;

    localhost.ReportService localrs = new localhost.ReportService();
    localrs.Url = GetServiceURL();
    reportList = localrs.RunningReports();


    but I am getting the following error

    Error 67 Cannot implicitly convert type 'localhost.RunningReport[]' to
    'System.Collections.Generic.List<Reports.Modules.RunningJobs.RunningReport>


    Thank You

    Peter


    //////////////// Heres' the XML data from the WebService
    ///////////////////////////////////

    <?xml version="1.0" encoding="utf-8" ?>
    ArrayOfRunningReport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://wsinc.com/webservices/">
    <RunningReport>
    <ReportID>0</ReportID>
    <CreatedBy>12</CreatedBy>
    <ItemId>1</ItemId>
    <OutputType>PDF</OutputType>
    </RunningReport>
    <RunningReport>
    <ReportID>0</ReportID>
    <CreatedBy>12</CreatedBy>
    <ItemId>2</ItemId>
    <OutputType>PDF</OutputType>
    </RunningReport>
    </ArrayOfRunningReport>


    ///////////////////////////////////// Here's the class that the Webservice
    is returning: ////////////////////////////////////////////

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ReportInfoLib
    {
    [Serializable]
    public class RunningReport
    {
    private string _reportName;
    private int _reportID;
    private int _createdBy;
    private string _discription;
    private int _itemId;
    private DocumentTypeEnum _outputType;
    private string _printerName;
    private string _trayName;
    private string _emailList;
    private List<ParameterNameValue> _pnv;

    public string ReportName
    {
    get { return this._reportName; }
    set { this._reportName = value; }
    }

    public int ReportID
    {
    get { return this._reportID; }
    set { this._reportID = value; }
    }

    public int CreatedBy
    {
    get { return this._createdBy; }
    set { this._createdBy = value; }
    }

    public string Discription
    {
    get { return this._discription; }
    set { this._discription = value; }
    }

    public int ItemId
    {
    get { return this._itemId; }
    set { this._itemId = value; }
    }

    public ReportInfoLib.DocumentTypeEnum OutputType
    {
    get { return this._outputType; }
    set { this._outputType = value; }
    }

    public string PrinterName
    {
    get { return this._printerName; }
    set { this._printerName = value; }
    }

    public string TrayName
    {
    get { return this._trayName; }
    set { this._trayName = value; }
    }

    public string EmailList
    {
    get { return this._emailList; }
    set { this._emailList = value; }
    }

    public
    System.Collections.Generic.List<ReportInfoLib.ParameterNameValue> Pnv
    {
    get { return this._pnv; }
    set { this._pnv = value; }
    }
    }
    }
    Peter, Oct 9, 2008
    #1
    1. Advertising

  2. "Peter" <> wrote in message
    news:...
    > I have a WebService which returns a List of RunningReport class
    > How do I read this XML data on the client side. How do I convert
    > List<RunningReport> from the WebService side to List<RunningReport> on the
    > client side


    Sorry, it doesn't work this way.

    The client has no idea what type the server is using. Remember that the
    client could be running Java, in which case, it certainly doesn't know
    anything about List<RunningReport>.

    What the client _does_ know about is the XML Schema that it gets from the
    WSDL file that it gets from the server when you use Add Web Reference. That
    schema will have a section similar to this:

    <xs:element name="ArrayOfRunningReport">
    <xs:complexType>
    <xs:sequence>
    <xs:element minOccurs="0" maxOccurs="unbounded" type="RunningReport"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>

    Notice the total lack of mention of List<T>.

    Using ASMX web services (which you seem to be doing), that will always
    translate into RunningReport[] on the client. If you were using WCF, you'd
    be able to tell it to use List<T> instead. Since you're using the old stuff,
    you'll have to fake it:

    List<RunningReport> reportList ; //= null; Don't do this. The
    default is null, besides, it gets overwritten

    localhost.ReportService localrs = new localhost.ReportService();
    localrs.Url = GetServiceURL();
    RunningReports[] reportsArray = localrs.RunningReports();
    reportList = new List<RunningReports>(reportsArray);

    --
    John Saunders | MVP - Connected System Developer
    John Saunders, Oct 10, 2008
    #2
    1. Advertising

  3. Peter

    Peter Guest

    "John Saunders" <> wrote in message
    news:OcpE$...
    > "Peter" <> wrote in message
    > news:...
    >> I have a WebService which returns a List of RunningReport class
    >> How do I read this XML data on the client side. How do I convert
    >> List<RunningReport> from the WebService side to List<RunningReport> on
    >> the client side

    >
    > Sorry, it doesn't work this way.
    >
    > The client has no idea what type the server is using. Remember that the
    > client could be running Java, in which case, it certainly doesn't know
    > anything about List<RunningReport>.
    >
    > What the client _does_ know about is the XML Schema that it gets from the
    > WSDL file that it gets from the server when you use Add Web Reference.
    > That schema will have a section similar to this:
    >
    > <xs:element name="ArrayOfRunningReport">
    > <xs:complexType>
    > <xs:sequence>
    > <xs:element minOccurs="0" maxOccurs="unbounded" type="RunningReport"/>
    > </xs:sequence>
    > </xs:complexType>
    > </xs:element>
    >
    > Notice the total lack of mention of List<T>.
    >
    > Using ASMX web services (which you seem to be doing), that will always
    > translate into RunningReport[] on the client. If you were using WCF, you'd
    > be able to tell it to use List<T> instead. Since you're using the old
    > stuff, you'll have to fake it:
    >
    > List<RunningReport> reportList ; //= null; Don't do this. The
    > default is null, besides, it gets overwritten
    >
    > localhost.ReportService localrs = new localhost.ReportService();
    > localrs.Url = GetServiceURL();
    > RunningReports[] reportsArray = localrs.RunningReports();
    > reportList = new List<RunningReports>(reportsArray);
    >
    > --
    > John Saunders | MVP - Connected System Developer
    >
    >


    Thank You for your help!

    This the following line does not work:
    RunningReports[] reportsArray = localrs.RunningReports();

    Cannot implicitly convert type 'localhost.RunningReport[]' to
    'Reports.Modules.RunningJobs.RunningReport[]'
    Peter, Oct 10, 2008
    #3
  4. Peter

    Steven Cheng Guest

    Hi Peter,

    The problem you encountered, is caused by XML webservice does not expose
    implement details to client(only expose WSDL service description) for
    interop purpose. Therefore, for any custom types used in webservice, by
    default the client-side will generate a light weight delegate class to
    represent it. That's why, for your scenario, it reports the following error:

    ================
    Cannot implicitly convert type 'localhost.RunningReport[]' to
    'Reports.Modules.RunningJobs.RunningReport[]'
    ===============

    here the "localhost.RunningReport" type is generated by the webservice
    client proxy(add webreference), while
    "Reports.Modules.RunningJobs.RunningReport" is your own type(the type used
    at server-side).

    Currently one way to overcome this problem is manually modify the
    auto-generated webservice proxy's source code. You can change the return
    type from the "localhost.RunningReport[]" to
    "Reports.Modules.RunningJobs.RunningReport[]". The drawback of this is
    when you update the webservice refefence, your change will be overwritten.
    To avoid this, you can add a partial class file for the webservice clienet
    proxy class, and add a new method (the same signature and attributes as the
    original webmethod), and chang the return type to the one you want.

    Hope this helps.

    Sincerely,

    Steven Cheng

    Microsoft MSDN Online Support Lead


    Delighting our customers is our #1 priority. We welcome your comments and
    suggestions about how we can improve the support we provide to you. Please
    feel free to let my manager know what you think of the level of service
    provided. You can send feedback directly to my manager at:
    .

    ==================================================
    Get notification to my posts through email? Please refer to
    http://msdn.microsoft.com/en-us/subscriptions/aa948868.aspx#notifications.
    ==================================================
    This posting is provided "AS IS" with no warranties, and confers no rights.
    --------------------
    >From: "Peter" <>
    >References: <>

    <OcpE$>
    >Subject: Re: Read WebService List<> data
    >Date: Thu, 9 Oct 2008 21:19:42 -0500


    >
    >
    >"John Saunders" <> wrote in message
    >news:OcpE$...
    >> "Peter" <> wrote in message
    >> news:...
    >>> I have a WebService which returns a List of RunningReport class
    >>> How do I read this XML data on the client side. How do I convert
    >>> List<RunningReport> from the WebService side to List<RunningReport> on
    >>> the client side

    >>
    >> Sorry, it doesn't work this way.
    >>
    >> The client has no idea what type the server is using. Remember that the
    >> client could be running Java, in which case, it certainly doesn't know
    >> anything about List<RunningReport>.
    >>
    >> What the client _does_ know about is the XML Schema that it gets from

    the
    >> WSDL file that it gets from the server when you use Add Web Reference.
    >> That schema will have a section similar to this:
    >>
    >> <xs:element name="ArrayOfRunningReport">
    >> <xs:complexType>
    >> <xs:sequence>
    >> <xs:element minOccurs="0" maxOccurs="unbounded" type="RunningReport"/>
    >> </xs:sequence>
    >> </xs:complexType>
    >> </xs:element>
    >>
    >> Notice the total lack of mention of List<T>.
    >>
    >> Using ASMX web services (which you seem to be doing), that will always
    >> translate into RunningReport[] on the client. If you were using WCF,

    you'd
    >> be able to tell it to use List<T> instead. Since you're using the old
    >> stuff, you'll have to fake it:
    >>
    >> List<RunningReport> reportList ; //= null; Don't do this. The
    >> default is null, besides, it gets overwritten
    >>
    >> localhost.ReportService localrs = new localhost.ReportService();
    >> localrs.Url = GetServiceURL();
    >> RunningReports[] reportsArray = localrs.RunningReports();
    >> reportList = new List<RunningReports>(reportsArray);
    >>
    >> --
    >> John Saunders | MVP - Connected System Developer
    >>
    >>

    >
    >Thank You for your help!
    >
    >This the following line does not work:
    >RunningReports[] reportsArray = localrs.RunningReports();
    >
    >Cannot implicitly convert type 'localhost.RunningReport[]' to
    >'Reports.Modules.RunningJobs.RunningReport[]'
    >
    >
    >
    Steven Cheng, Oct 10, 2008
    #4
  5. ""Steven Cheng"" <> wrote in message
    news:...
    > Hi Peter,
    >
    > The problem you encountered, is caused by XML webservice does not expose
    > implement details to client(only expose WSDL service description) for
    > interop purpose. Therefore, for any custom types used in webservice, by
    > default the client-side will generate a light weight delegate class to
    > represent it. That's why, for your scenario, it reports the following
    > error:
    >
    > ================
    > Cannot implicitly convert type 'localhost.RunningReport[]' to
    > 'Reports.Modules.RunningJobs.RunningReport[]'
    > ===============
    >
    > here the "localhost.RunningReport" type is generated by the webservice
    > client proxy(add webreference), while
    > "Reports.Modules.RunningJobs.RunningReport" is your own type(the type used
    > at server-side).
    >
    > Currently one way to overcome this problem is manually modify the
    > auto-generated webservice proxy's source code. You can change the return
    > type from the "localhost.RunningReport[]" to
    > "Reports.Modules.RunningJobs.RunningReport[]". The drawback of this is
    > when you update the webservice refefence, your change will be overwritten.
    > To avoid this, you can add a partial class file for the webservice clienet
    > proxy class, and add a new method (the same signature and attributes as
    > the
    > original webmethod), and chang the return type to the one you want.


    As Steven has said, this will not work, as it will be overwritten every time
    you update your web reference.

    The correct solution is simply to use:

    localhost.RunningReports[] reportsArray = localrs.RunningReports();
    --
    John Saunders | MVP - Connected System Developer
    John Saunders, Oct 10, 2008
    #5
  6. Peter

    Peter Guest

    "John Saunders" <> wrote in message
    news:...
    > ""Steven Cheng"" <> wrote in message
    > news:...
    >> Hi Peter,
    >>
    >> The problem you encountered, is caused by XML webservice does not expose
    >> implement details to client(only expose WSDL service description) for
    >> interop purpose. Therefore, for any custom types used in webservice, by
    >> default the client-side will generate a light weight delegate class to
    >> represent it. That's why, for your scenario, it reports the following
    >> error:
    >>
    >> ================
    >> Cannot implicitly convert type 'localhost.RunningReport[]' to
    >> 'Reports.Modules.RunningJobs.RunningReport[]'
    >> ===============
    >>
    >> here the "localhost.RunningReport" type is generated by the webservice
    >> client proxy(add webreference), while
    >> "Reports.Modules.RunningJobs.RunningReport" is your own type(the type
    >> used
    >> at server-side).
    >>
    >> Currently one way to overcome this problem is manually modify the
    >> auto-generated webservice proxy's source code. You can change the return
    >> type from the "localhost.RunningReport[]" to
    >> "Reports.Modules.RunningJobs.RunningReport[]". The drawback of this is
    >> when you update the webservice refefence, your change will be
    >> overwritten.
    >> To avoid this, you can add a partial class file for the webservice
    >> clienet
    >> proxy class, and add a new method (the same signature and attributes as
    >> the
    >> original webmethod), and chang the return type to the one you want.

    >
    > As Steven has said, this will not work, as it will be overwritten every
    > time you update your web reference.
    >
    > The correct solution is simply to use:
    >
    > localhost.RunningReports[] reportsArray = localrs.RunningReports();
    > --
    > John Saunders | MVP - Connected System Developer
    >
    >


    Thank You for your help, that worked!

    I also switched to WCF, which works very nice.
    Peter, Oct 10, 2008
    #6
  7. Peter

    Steven Cheng Guest

    Hi Peter,

    I'm glad that you've got it working. If there is anything else need help
    later, welcome to post here.

    Sincerely,

    Steven Cheng

    Microsoft MSDN Online Support Lead


    Delighting our customers is our #1 priority. We welcome your comments and
    suggestions about how we can improve the support we provide to you. Please
    feel free to let my manager know what you think of the level of service
    provided. You can send feedback directly to my manager at:
    .


    --------------------
    >From: "Peter" <>
    >References: <>

    <OcpE$>
    <>
    <>
    <>
    >Subject: Re: Read WebService List<> data
    >Date: Fri, 10 Oct 2008 16:17:19 -0500


    >
    >"John Saunders" <> wrote in message
    >news:...
    >> ""Steven Cheng"" <> wrote in message
    >> news:...
    >>> Hi Peter,
    >>>
    >>> The problem you encountered, is caused by XML webservice does not expose
    >>> implement details to client(only expose WSDL service description) for
    >>> interop purpose. Therefore, for any custom types used in webservice, by
    >>> default the client-side will generate a light weight delegate class to
    >>> represent it. That's why, for your scenario, it reports the following
    >>> error:
    >>>
    >>> ================
    >>> Cannot implicitly convert type 'localhost.RunningReport[]' to
    >>> 'Reports.Modules.RunningJobs.RunningReport[]'
    >>> ===============
    >>>
    >>> here the "localhost.RunningReport" type is generated by the webservice
    >>> client proxy(add webreference), while
    >>> "Reports.Modules.RunningJobs.RunningReport" is your own type(the type
    >>> used
    >>> at server-side).
    >>>
    >>> Currently one way to overcome this problem is manually modify the
    >>> auto-generated webservice proxy's source code. You can change the return
    >>> type from the "localhost.RunningReport[]" to
    >>> "Reports.Modules.RunningJobs.RunningReport[]". The drawback of this is
    >>> when you update the webservice refefence, your change will be
    >>> overwritten.
    >>> To avoid this, you can add a partial class file for the webservice
    >>> clienet
    >>> proxy class, and add a new method (the same signature and attributes as
    >>> the
    >>> original webmethod), and chang the return type to the one you want.

    >>
    >> As Steven has said, this will not work, as it will be overwritten every
    >> time you update your web reference.
    >>
    >> The correct solution is simply to use:
    >>
    >> localhost.RunningReports[] reportsArray = localrs.RunningReports();
    >> --
    >> John Saunders | MVP - Connected System Developer
    >>
    >>

    >
    >Thank You for your help, that worked!
    >
    >I also switched to WCF, which works very nice.
    >
    >
    >
    Steven Cheng, Oct 13, 2008
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. batista
    Replies:
    1
    Views:
    896
    Laurent Bugnion
    Jan 26, 2006
  2. batista
    Replies:
    0
    Views:
    551
    batista
    Jan 26, 2006
  3. Mr. x
    Replies:
    2
    Views:
    703
    Andrew
    Oct 10, 2003
  4. Cyril
    Replies:
    2
    Views:
    4,485
    Cyril
    Jun 1, 2006
  5. Mr. x

    use another webservice in a webservice

    Mr. x, Sep 26, 2003, in forum: ASP .Net Web Services
    Replies:
    0
    Views:
    137
    Mr. x
    Sep 26, 2003
Loading...

Share This Page