ステートフル サービス ファブリック アプリケーションで 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.DataContractStateSerializer
1.Write(T value, BinaryWriter binaryWriter) at System.Fabric.Store.TStore
5.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.DistributedQueue
1.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>
うまくいきました。