1

私は wcf-webservice を開発しています。コンシューマーは、atom-response と json-response のどちらかを選択できます。

私の OperationContract は次のようになります。

[OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "json/json")]
    Result GetData();

Result-Type には、いくつかの文字列とエントリの配列が含まれています。

 [DataContract]
public class Result
{
    [DataMember]
    public string baseUrl;
    [DataMember]
    public string url;
    [DataMember]
    public string title;
    [DataMember]
    public int totalResults;
    [DataMember]
    public JsonEntries[] resources;
}

JsonEntries も DataContract としてマークしました。

  [DataContract]
public class JsonEntries
{
    [DataMember]
    public string updated;
    [DataMember]
    public string key;
    [DataMember]
    public string title;
    [DataMember]
    public Salary salarie;
}

ただし、これを実行しようとすると、メタデータを呼び出せなかったというエラーが表示されます。配列の前を削除すると、[DataMember]エラーは発生しませんが、応答に配列が含まれていません。さまざまな例でこのように機能するのを見てきました。それで、私は何を間違っていますか?

前もって感謝します。

ロビッド

4

1 に答える 1

1

うまくいくはずです、これが私のコードサンプルです

データ契約

[DataContract]
public class Result
{
    [DataMember]
    public int totalResults;
    [DataMember]
    public JsonEntries[] resources;
}

[DataContract]
public class JsonEntries
{
    [DataMember]
    public string title;
}

運用契約

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "getdata")]
Result GetData();

    public Result GetData()
    {
        var jsonEntries = new List<JsonEntries>
            {
                new JsonEntries {title = "1"},
                new JsonEntries {title = "2"},
                new JsonEntries {title = "3"}
            }.ToArray();
        return new Result
        {
            resources = jsonEntries,
            totalResults = 1
        };
    }

私の呼び出し

    private Bag<T> GetData<T>(string uri)
    {
        try
        {
            var request = (HttpWebRequest) WebRequest.Create(uri);
            request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
            request.Headers[HttpRequestHeader.Authorization] = _authorizationData;
            var response = (HttpWebResponse) request.GetResponse();
            Stream stream = response.GetResponseStream();
            var localStream = new MemoryStream();
            CopyStream(stream, localStream);
            stream.Close();
            var result = JsonContractExtensions.Create<T>(localStream);
            return new Bag<T>(result);
        }
        catch (WebException ex)
        {
            _log.Debug(ex);
            return Bag<T>.Empty;
        }
        catch (Exception ex)
        {
            _log.Debug(ex);
            return Bag<T>.Empty;
        }
    }
于 2012-07-30T22:21:28.123 に答える