1

このクラスをシリアル化したいので、httpresponsemessageの本文として送信できます。

  [DataContract]
public class Subscription : TableServiceEntity
{
    [DataMember]
    public string SubscriptionId { get; set; }
    [DataMember]
    public bool IsAdmin { get; set; }
}

私がそれを使いたい方法:

 IList<Subscription> subs = ... ;

        return new HttpResponseMessage<IList<Subscription>>(subs);

コンパイルされますが、この部分を実行すると、IListをシリアル化できないというエラーが表示され、既知のタイプのコレクションに追加する必要があります。TableServiceEntityのメンバーはシリアル化できないと思います。そのため、リスト全体をシリアル化することはできませんが、この問題を解決する方法がわかりません。

何か案は?

心から、

ゾリ

変形

最初のコメントで述べたように、新しいクラスを追加しました。次のようになります。

 [DataServiceEntity]
[DataContract]
[KnownType(typeof(Subscription))]
public abstract class SerializableTableServiceEntity
{
    [DataMember]
    public string PartitionKey { get; set; }

    [DataMember]
    public string RowKey { get; set; }

    [DataMember]
    public DateTime Timestamp { get; set; }
}


[DataContract]
public class Subscription : SerializableTableServiceEntity
{
    [DataMember]
    public string SubscriptionId { get; set; }
    [DataMember]
    public bool IsAdmin { get; set; }
}

まだエラーが発生します

add type to known type collection and to use the serviceknowntypeattribute before the operations

私が使用する唯一の操作はこれです:

public class DBModelServiceContext : TableServiceContext
{
    public DBModelServiceContext(string baseAddress, StorageCredentials credentials)
        : base(baseAddress, credentials) {  }

    public IList<Subscription> Subscriptions
    {
        get
        {
            return this.CreateQuery<Subscription>("Subscriptions").ToArray();
        }
    }
}

変更2

私のインターフェースは次のようになります。

  [OperationContract]
    [ServiceKnownType(typeof(IList<Subscription>))] 
    [WebGet(UriTemplate = "subscription/{value}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    HttpResponseMessage<IList<Subscription>> GetSubscription(string value);

背後にある実装は次のとおりです。

 public HttpResponseMessage<IList<Subscription>> GetSubscription(string value)
    {                        
        var account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
        var context = new DBModelServiceContext(account.TableEndpoint.ToString(), account.Credentials);
        IList<Subscription> subs = context.Subscriptions;

        return new HttpResponseMessage<IList<Subscription>>(subs);}
4

2 に答える 2

2

私はなんとか解決策を見つけることができました:

自作のクラス(私の場合はSubscription)は、datacontract、datamember、knowntype属性を持つカスタムTableServiceEntityクラスから継承する必要があります。

[DataContract]    
[KnownType(typeof(Subscription))]
public abstract class SerializableTableServiceEntity
{
    [DataMember]
    public string PartitionKey { get; set; }

    [DataMember]
    public string RowKey { get; set; }

    [DataMember]
    public DateTime Timestamp { get; set; }
}

 [DataContract]
    public class Subscription : SerializableTableServiceEntity
    {
        [DataMember]
        public string SubscriptionId { get; set; }
        [DataMember]
        public bool IsAdmin { get; set; }
    }

重要なのは、次のとおりです。結果をHttpResponseMessageとして返送し ないリターンタイプに関係なく、常にHttpResponseMessageになります。リターンタイプがIListの場合、シリアル化され、応答の本文に自動的に配置されます。ですから、そのまま返送してください。返信のステータスコードを変更する場合は、次のように行うことができます。

WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Forbidden;

リクエスト/レスポンスボディ/ヘッダーからすべてを取得/設定できます

WebOperationContext.Current

お役に立てば幸いです。

添加:

ただし、自己作成クラス(私の場合はサブスクリプション)タイプのオブジェクトをazureデータベースから取得した場合、それを削除できないことに注意してください。

Subscription s = (from e in this.CreateQuery<Subscription>("Subscriptions")
                                       where e.SubscriptionId == subscriptionID
                                       select e).FirstOrDefault();
context.DeleteObject(s); //THIS WILL THROW AN EXCEPTION

代わりに、戻りタイプはTableServiceEntityから継承されたものでなければならず、削除できるのはそれだけです。

私が間違っている場合は、この投稿を更新してください!

于 2012-05-17T08:16:42.143 に答える
1

TableServiceEntityから継承する代わりに、独自のクラスを作成し、それを使用するようにazureに指示する必要があります。

[DataServiceEntity]
[DataContract]
public class MyClass
{
    [DataMember]
    public string PartitionKey { get; set; }

    [DataMember]
    public string RowKey { get; set; }

    [DataMember]
    public DateTime Timestamp { get; set; }
}

重要な点は、 Azureでこのクラスを使用できるようにするDataServiceEntity属性です。

于 2012-05-15T16:19:49.437 に答える