2

ステートフル サービス ファブリック アプリケーションで Reliable Queue を使用しています。アイテムをエンキューしようとすると、エンキュー メソッドが例外をスローします。

使用されるコードは

 protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            ICommand myItem = new CreateCommand()
            {
                Data = "Sample Data",
                Id = Guid.NewGuid(),
                TenentName = "SampleTenant"
            };
            var myQueue = await this.StateManager.GetOrAddAsync<IReliableQueue<ICommand>>("CommandQueue");
            using (var tx = StateManager.CreateTransaction())
            {
                await myQueue.EnqueueAsync(tx, myItem, TimeSpan.FromSeconds(4), cancellationToken);
                await tx.CommitAsync();
            }
            using (var tx = StateManager.CreateTransaction())
            {
                var dq = await myQueue.TryDequeueAsync(tx);
                await tx.CommitAsync();
            }
        }
    }

    public interface ICommand
    {
        Guid Id { get; set; }
        string TenentName { get; set; }
    }


    public class CreateCommand : ICommand
    {
        public Guid Id { get; set; }
        public string TenentName { get; set; }
        public string Data { get; set; }
    }

myQueue.EnqueueAsync で、例外がスローされています

データ コントラクト名 'CreateCommand: http://schemas.datacontract.org/2004/07/TestService ' で 'TestService.CreateCommand' を入力することは想定されていません。DataContractSerializer を使用している場合は、DataContractResolver の使用を検討してください。または、KnownTypeAttribute 属性を使用するか、シリアライザーに渡される既知の型のリストにそれらを追加するなどして、既知の型のリストに静的に認識されていない型を追加します。

スタックトレース

System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType (DataContract dataContract、XmlWriterDelegator xmlWriter、オブジェクト obj、ブール値の verifyKnownType、RuntimeTypeHandle 宣言された TypeHandle、宣言された型) でSystem.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator ライター、オブジェクト グラフ、DataContractResolver dataContractResolver) で System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator ライター、オブジェクト グラフ、DataContractResolver dataContractResolver) で System.Runtime.シリアル化。XmlObjectSerializer.WriteObjectHandleExceptions (XmlWriterDelegator ライター、オブジェクト グラフ、DataContractResolver dataContractResolver)、System.Runtime.Serialization.XmlObjectSerializer.WriteObject (XmlDictionaryWriter ライター、オブジェクト グラフ)、Microsoft.ServiceFabric.Replicator.DataContractStateSerializer1.Write(T value, BinaryWriter binaryWriter) at System.Fabric.Store.TStore5.GetValueBytes(TValue currentValue, TValue newValue) System.Fabric.Store.TStore で5.<AddAsync>d__4.MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.ServiceFabric.Data.Collections.DistributedQueue1.d__9.MoveNext() System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification( Task task) の System.Runtime.CompilerServices.TaskAwaiter.GetResult()
の TestService.TestService.d__2.MoveNext() の D:\Projects\Local\ReliableSerialization\Application1\TestService\TestService.cs:System.Runtime の 51 行目。 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) の CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) Microsoft.ServiceFabric.Services.Runtime.StatefulServiceReplicaAdapter.d__f.MoveNext()

Concrete 型を使用するようにコードを変更すると、正常に機能しました。

私の場合IReliableQueue<CreateCommand>

うまくいきました。

私のコード参照: https://github.com/Azure-Samples/service-fabric-dotnet-iot/blob/master/src/gateway/IoTProcessorManagement.Common/WorkManagement/WorkManager.cs

4

1 に答える 1