Error processing response stream. The XML element contains mixed content. 

Ok, in my last post I explained how to pass an array of values to the Webget method of an Ado DataService as a primitive value (csv), in this post Im going to show how to retrieve a primitive value from a Webget method avoiding the error message above.

Lets start with the Dataservice:

[WebGet] //we are going to return an int

public IQueryable<int> DWTNewDownTime(int metricArrayID, string metricDate)

{  //create the command as we used to do in 1.1

    DbCommand cmd = this.CurrentDataSource.Connection.CreateCommand();

    cmd.CommandType = CommandType.StoredProcedure;

    //add the parameters needed for the stored procedure

    EntityParameter MetricArrayID = new EntityParameter("MetricArrayID", DbType.Int16);

    MetricArrayID.Value = metricArrayID;

    cmd.Parameters.Add(MetricArrayID);

    EntityParameter MetricDate = new EntityParameter("MetricDate", DbType.String, 50);

    MetricDate.Value = metricDate;

    cmd.Parameters.Add(MetricDate);      

    //add an output parameter, this parameter should be returned as a SELECT not return from the stored procedure

    EntityParameter Res = new EntityParameter("res", DbType.Int16, 20);

    Res.Direction = ParameterDirection.Output;

    cmd.Parameters.Add(Res);

    //constructs the command text

    cmd.CommandText = string.Format(@"{0}.{1}", this.CurrentDataSource.DefaultContainerName, "DWTGetMetricValuesNewDownTimeActions");

    try

    {//open connection and execute an scalar

        cmd.Connection.Open();

        cmd.ExecuteScalar();

    }

    catch (System.Exception ex)

    {

        throw new System.Exception(ex.InnerException.Message);

    }

    finally

    {   //always close the connection

        cmd.Connection.Close();

    }//return the result output value.

    List<int> _list = new List<int> { Convert.ToInt32(Res.Value) };

    return _list.AsQueryable();

}

 

As I mention above the stored procedure should return the output parameter as SELECT.

now lets see the ModelView:

 

public void DWTGetMetricValuesNewDownTimeActions(int metricArrayID, string metricDate)

{   //create a DataserviceQuery as we normally do for other webget methods

    QryInsertMetric = this.context.CreateQuery<int>("DWTNewDownTime")

        .AddQueryOption("MetricArrayID", metricArrayID)

        .AddQueryOption("MetricDate", "’" + metricDate + "’");

    //then create a webclient that will be used to execute the above query

    WebClient wc = new WebClient();

    wc.DownloadStringAsync(QryInsertMetric.RequestUri);

    wc.DownloadStringCompleted += (s, e) =>

    {   //we have to parse the returning XML

        XDocument xdoc = XDocument.Parse(e.Result);

        MetricValueID = Convert.ToInt32(xdoc.Root.Descendants(((XNamespace)@"http://schemas.microsoft.com/ado/2007/08/dataservices&quot;) + "element")

            .Select(xe => xe.Value).ToList().Single());

        //fire the property so you can catch it at your silverlight client

        FirePropertyChanged("MetricValueID");

    };

}

 

Finally just catch the property change at your client:

void Downtimemodel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)

{

    if (e.PropertyName == "MetricValueID")

    {

        Console.WriteLine(Downtimemodel.MetricValueID.ToString());

    }   

}

and that’s it, I hope this help someone get home early.

some help from Invoking a WebGet throws an exception @ msdn