Question

Since Wcf REST do not support Out parameter .Then how can I get the value from the method that is retuning the value.

    [OperationContract(IsOneWay = false)]
    [WebInvoke
     (Method = "GET",
     ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
     UriTemplate = "xml/getcommentsforvideopage?vid={videoID}&psize={pageSize}&pnum={pageNumber}")]
    IEnumerable<DTOUserComment> GetCommentsForVideoPage(
        // out int resultCount,
                    int videoID, string pageSize,
                    string pageNumber);

Implemented as this below------------------

    public IEnumerable<DTOUserComment> GetCommentsForVideoPage(
            int videoID, string pageSize,
            string pageNumber)
    {
        int? pageSizeInt = pageSize.ParseNullableInt();
        int? pageNumberInt = pageNumber.ParseNullableInt();
        IEnumerable<DTOUserComment> results = null;

        // TODO
        int resultCount;

        try
        {
            results = searcher.GetCommentsForVideoPage(**out resultCount,** videoID, pageSizeInt, pageNumberInt);
        }
        catch (UnauthorizedAccessException ex)
        {
            Logger.Write(ex);
        }
        catch (Exception ex)
        {
            Logger.Write(ex);
        }

        return results;
    }  

Client Side I am consuming using HttpClient--

public IEnumerable<UserComment> CommentsPage(int videoId, int startRowIndex, int maximumRows)
    {
        int pageSize = maximumRows;
        if (maximumRows < 1) { maximumRows = 1; }
        int startingPage = (startRowIndex / maximumRows) + 1;
        using (var client = new HttpClient())
        {
                HttpResponseMessage response = client.GetAsync("http://localhost:25252/MyRESTService.svc/xml/getcommentsforvideopage?vid=" + videoId + "&psize=" + pageSize + "&pnum=" + startingPage).Result;
                string strJson = response.Content.ReadAsStringAsync().Result;
                JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
                var data = JObject.Parse(strJson)["GetCommentsForVideoPageResult"];//JSON array starts with "GetCommentsForVideoPageResult"
                IEnumerable<UserComment> comments = JsonConvert.DeserializeObject<IEnumerable<UserComment>>(data.ToString(),settings);
                return comments;
            }
}
Was it helpful?

Solution

Do these things.

1.Create a wrapper class like this

public class WrappedDTOUserComment
{
    public IEnumerable<DTOUserComment> Comments { get; set; }
    public int CommentCount { get; set; }

}

2.Then change the method like this

public WrappedDTOUserComment GetCommentsForVideoPage(
        int videoID, string pageSize,
        string pageNumber)
{
    int? pageSizeInt = pageSize.ParseNullableInt();
    int? pageNumberInt = pageNumber.ParseNullableInt();
    WrappedDTOUserComment data = null;
    IEnumerable<DTOUserComment> results = null;
    // TODO
    int resultCount;

    try
    {
        results = searcher.GetCommentsForVideoPage(**out resultCount,** videoID, pageSizeInt, pageNumberInt);
    }
    catch (UnauthorizedAccessException ex)
    {
        Logger.Write(ex);
    }
    catch (Exception ex)
    {
        Logger.Write(ex);
    }
    data.Comments = results;
    data.CommentCount = resultCount;
    return data;
}

3.The interface will be

[OperationContract(IsOneWay = false)]
[WebInvoke
 (Method = "GET",
 ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
 UriTemplate = "xml/getcommentsforvideopage?vid={videoID}&psize={pageSize}&pnum={pageNumber}")]
WrappedDTOUserComment GetCommentsForVideoPage(
    // out int resultCount,
                int videoID, string pageSize,
                string pageNumber);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top