Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法实现传奇,_C#_Wcf_Nservicebus_Esb - Fatal编程技术网

C# 无法实现传奇,

C# 无法实现传奇,,c#,wcf,nservicebus,esb,C#,Wcf,Nservicebus,Esb,我有一个简单的单向消息传递模式,我需要实现Saga,因为我需要调用5个以上的web服务,所以任何服务都无法响应,我不希望Saga完整 但当我实现saga时,它给出了一个错误,无法找到消息类型的saga,因此它调用SagaNotFoundHandler 这是我的传奇数据模型 public class MySagaData : ContainSagaData { [Unique] public Guid OrderID { get; set; } public strin

我有一个简单的单向消息传递模式,我需要实现Saga,因为我需要调用5个以上的web服务,所以任何服务都无法响应,我不希望Saga完整

但当我实现saga时,它给出了一个错误,无法找到消息类型的saga,因此它调用SagaNotFoundHandler

这是我的传奇数据模型

 public class MySagaData : ContainSagaData
  {
    [Unique]
   public Guid OrderID { get; set; }

   public string SomeData { get; set; }
    }
这是Saga和消息处理程序类

 public class PlaceOrderHandler : Saga<MySagaData> ,IHandleMessages<PlaceOrder>
{
    public override void ConfigureHowToFindSaga()
    {
        ConfigureMapping<PlaceOrder>(m => m.OrderID).ToSaga(s => s.OrderID);
    }

    public void Handle(PlaceOrder message)
    {
        try
        {
            Console.WriteLine("ORder Recevied....for ID {0}", message.OrderID);
                //invoke 5 web service methods();
            MarkAsComplete();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
  }
公共类PlaceOrderHandler:Saga,IHandleMessages
{
公共覆盖无效配置HowtoFindsaga()
{
配置映射(m=>m.OrderID).ToSaga(s=>s.OrderID);
}
公共无效句柄(PlaceOrder消息)
{
尝试
{
WriteLine(“为ID{0}接收的订单,”,message.OrderID);
//调用5个web服务方法();
MarkAsComplete();
}
捕获(例外e)
{
控制台写入线(e.Message);
}
}
}
这是我的端点配置

   public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization,IWantToRunWhenBusStartsAndStops
{

    public void Init()
    {
        Configure.With()
              .DefaultBuilder()
              .UseTransport<Msmq>()
              .MsmqSubscriptionStorage()
              .InMemorySagaPersister()
              .UseInMemoryTimeoutPersister()
              .UnicastBus();
    }

    public void Start()
    {
        Console.WriteLine("This is the process hosting the saga.");
    }

    public void Stop()
    {
        Console.WriteLine("Stopped.");
    }
}
public class EndpointConfig:IConfigureThisEndpoint、AsA_服务器、IWantCustomInitialization、iwantToRunshenbusStartAndStops
{
公共void Init()
{
用()配置
.DefaultBuilder()
.UseTransport()
.MsmqSubscriptionStorage()
.inMemorySagPersister()中的
.UseInMemoryTimeoutPersister()中使用
.UnicastBus();
}
公开作废开始()
{
WriteLine(“这是承载传奇的过程。”);
}
公共停车场()
{
控制台。写入线(“停止”);
}
}

简短回答:您的传奇永远不会被创建,因为您还没有实现IAmStartedByMessages接口

更详细的回答:根据您的描述,这看起来不像是一个很好的传奇案例。如果传入一条消息,并且处理程序实际上只是通过过程代码顺序调用五个web服务,那么您真正需要的只是一个普通的消息处理程序。如果其中一个web服务失败,您可以抛出异常,该消息将通过NSB重试多次

综上所述,可以使用saga来管理web服务调用工作流。这对你的案子来说是否有意义是你必须决定的事情。它看起来像这样(非常粗糙,假设只有两个webservice调用):

  • 您的传奇实现了
    IAmStartedByMessages
    IHandleMessages
  • 当PlaceOrder消息到达时,该过程开始。PlaceOrder处理程序设置您的saga数据并启动Webservice调用#1
  • 当WebService调用#1完成时,它将发布WebService 1完成事件
  • WebService1Complete处理程序然后运行Webservice调用#2
  • 当Webservice调用#2完成时,它调用MarkAsComplete()