1

ですから、これは私にとってかなり新しいことであり、進歩を遂げています。現在、netmsmqbinding を使用して単純なメッセージをキューに送信する wcf サービスがあります。すべてがスムーズに実行され、イベント ビューには、メッセージがキューに入れられたことが示されます。私が実際のキューに行ったとき、そこには何もありませんが。サービス、サービス ホスト、および ASP Web アプリがあります。Web アプリには、サービスへのサービス参照があることに注意してください。イベント ビューアの msmq ログにも、3 つのイベントが表示されます。任意の支援をいただければ幸いです。ありがとう。

これが私のセットアップです。

サービス インターフェイス:

[ServiceContract]
public interface IMSMQService
{
    [OperationContract(IsOneWay = true)]
    void ShowMessage(string msg);
}

サービス:

public class MSMQService : IMSMQService
{
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void ShowMessage(string msg)
    {
        Debug.WriteLine(msg + " Received at: " + System.DateTime.Now.ToString());
    }
}

サービスの App.Config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>
    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
      <providers>
        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
      </providers>
    </roleManager>
  </system.web>

  <appSettings>
    <!-- use appSetting to configure MSMQ queue name -->
    <add key="queueName" value=".\private$\TestQueue"/>
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>

  <system.serviceModel>
    <services>
      <service name="MSMQNoSecurityService.MSMQService" behaviorConfiguration="MyBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9001/msmq"/>
          </baseAddresses>
        </host>
        <endpoint address="net.msmq://localhost/private/TestQueue" binding="netMsmqBinding" bindingConfiguration="MyBinding" contract="MyService.IMSMQService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>        
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <netMsmqBinding>
        <binding name="MyBinding">
          <security mode="None"/>
        </binding>
      </netMsmqBinding>
    </bindings>
  </system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>

サービスホスト

static void Main(string[] args)
{
    ServiceHost svcHost = null;
    try
    {
        // Get MSMQ queue name from appsettings in configuration.
        string queueName = ConfigurationManager.AppSettings["queueName"];

        // Create the transacted MSMQ queue if necessary.
        if (!MessageQueue.Exists(queueName))
            MessageQueue.Create(queueName, true);

        svcHost = new ServiceHost(typeof(MyService.MSMQService));
        svcHost.Open();
        Console.WriteLine("\n\nService is Running  at following address");
        Console.WriteLine("\nhttp://localhost:9001/MSMQService");

    }
    catch (Exception eX)
    {
        svcHost = null;
        Console.WriteLine("Service can not be started \n\nError Message [" + eX.Message + "]");
    }

    if (svcHost != null)
    {

        Console.WriteLine("\nPress any key to close the Service");
        Console.ReadKey();
        svcHost.Close();
        svcHost = null;
    }   
}

サービス ホストの App.Config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>
    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
      <providers>
        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
      </providers>
    </roleManager>
  </system.web>

  <appSettings>
    <add key="queueName" value=".\private$\TestQueue"/>
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.serviceModel>
    <services>
      <service name="MyService.MSMQService" behaviorConfiguration="MyBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9001/msmq"/>
          </baseAddresses>
        </host>        
        <endpoint address="net.msmq://localhost/private/TestQueue" binding="netMsmqBinding" bindingConfiguration="MyBinding" contract="MyService.IMSMQService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>        
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <netMsmqBinding>
        <binding name="MyBinding"  >
          <security mode="None"/>
        </binding>
      </netMsmqBinding>
    </bindings>
  </system.serviceModel>
</configuration>

MVC コントローラー

public class WcfMsmqController : Controller
{        
    public ActionResult Index()
    {
        MSMQServiceClient proxy = new MSMQServiceClient();
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
        {                
            proxy.ShowMessage("test");
            scope.Complete();
        }             
        proxy.Close();

        return View();
    }

}

Web.config のサービス モデル (自動生成):

<system.serviceModel>
    <bindings>
      <netMsmqBinding>
        <binding name="NetMsmqBinding_IMSMQService">
          <security mode="None" />
        </binding>
      </netMsmqBinding>
    </bindings>
    <client>
      <endpoint address="net.msmq://localhost/private/TestQueue" binding="netMsmqBinding"
        bindingConfiguration="NetMsmqBinding_IMSMQService" contract="ServiceReference1.IMSMQService"
        name="NetMsmqBinding_IMSMQService" />
    </client>
</system.serviceModel>

MSMQ ログからのイベント: ここで表示するために一部を変更しました

  1. ID CN=msmq,CN=blah,OU=blah,OU=blah,DC=blah,DC=local\8280 のメッセージがキュー PRIVATE=blah に送信されました

  2. ID CN=msmq,CN=blah,OU=blah,OU=blah,DC=blah,DC=local\8280 のメッセージがキュー PRIVATE=blah に入れられました

  3. メッセージを受け取りました

4

2 に答える 2

0

それはあなたの取引に関連しているようです。

[TransactionFlow(TransactionFlowOption.Allowed)]サービス契約の操作に配置するようにしてください。何かのようなもの:

 [ServiceContract]
 public interface IMSMQService
 {
   [OperationContract(IsOneWay = true)]
   [TransactionFlow(TransactionFlowOption.Allowed)]
   void ShowMessage(string msg);
 } 

とにかく、これを Web ファームまたは複数のコンピューターが関係するものに展開する場合は、ローカル トランザクションに注意する必要があります。

于 2014-11-25T21:39:55.393 に答える
0

理解した。サービス契約に名前空間を追加する必要がありました。以前は、ある種の天ぷりがデフォルトでした。

[ServiceContract(Namespace = "http://MyService")]
public interface IMSMQService
{
    [OperationContract(IsOneWay = true)]
    [TransactionFlow(TransactionFlowOption.Allowed)]
    void ShowMessage(string msg);
}
于 2014-11-25T22:35:47.727 に答える