【问题标题】:how to handle the method returning OUT parameter in Wcf REST如何处理 Wcf REST 中返回 OUT 参数的方法
【发布时间】:2014-04-07 13:34:14
【问题描述】:

由于 Wcf REST 不支持 Out 参数。那么如何从重新调整值的方法中获取值。

    [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);

如下实现-------

    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;
    }  

我正在使用 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;
            }
}

【问题讨论】:

  • 创建一个封装了 DTO 和那些输出参数的父模型,并返回所有内容?

标签: wcf rest httpclient


【解决方案1】:

做这些事情。

1.像这样创建一个包装类

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

}

2.然后像这样改变方法

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.界面会是

[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);

【讨论】:

  • 正是我想要的。谢谢
猜你喜欢
  • 2013-04-18
  • 1970-01-01
  • 2010-10-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多