带有MSMQ绑定端点配置问题的WCF服务

时间:2016-10-26 18:45:28

标签: .net wcf iis msmq

现在几天都在寻找这个问题的解决方案,并且无法找到解决我确切问题的方法。基本上,我有一个我写的WCF服务,我正在使用MSMQ绑定。如果它在本地工作正常,但当我将它移动到我的服务器时,我遇到了一些问题。这是我的设置(这都是在Windows Server 2012上运行的):我已经设置了一个站点(默认站点),同时添加了Http,Https和net.msmq绑定。 DefaultSite也添加了net.msmq绑定 - 如果这有所不同。该站点分配给在AD帐户下运行的AppPool。该站点名为app.services,主机名为dev.app.services.domain。我有一个名为queueservice \ queuelogservice.svc的私有事务队列。我的队列上设置了大量权限(匿名登录,我的AD帐户,运行应用程序池的AD帐户,网络服务帐户,本地管理员帐户等 - 全部具有完全控制权限)。我的msmq端点是net.msmq://dev.app.services.domain/private/QueueService/QueueLogService.svc。我试图通过在IE中提取wcf服务来测试这个网址是http://dev.app.services.domain/QueueService/QueueLogService.svc

当我将WCF服务部署到默认站点时,它可以正常工作。但是当我将它部署到我的app.services网站时,我得到的只是“拒绝访问”错误:“打开队列时出错:访问被拒绝。( - 1072824283,0xc00e0025)。无法从队列中发送或接收。确保已安装并运行MSMQ。还要确保可以使用所需的访问模式和授权打开队列。

我已经阅读了汤姆·霍兰德(https://blogs.msdn.microsoft.com/tomholl/2008/07/12/msmq-wcf-and-iis-getting-them-to-play-nice-part-1/)的文章“MSMQ,WCF和IIS:让他们玩得很好”第1-3部分,这很棒,但它并没有告诉我任何关于如何在localhost以外的其他站点下进行此设置。我确定我只是错过了一些简单的东西,但我似乎无法弄明白。我读到我可能需要重命名我的队列以匹配我的站点名称(app.services \ queueservice \ queuelogservice.svc),但这不起作用。无法使用主机名命名(dev.app.services.domain \ queueservice \ queuelogservice.svc)。我玩了很多组合,但没有骰子。我要么得到非常讨厌的错误,要么最终得到这个访问被拒绝的问题。我的期望是我可以在IE中看到标准的QueueLogService页面,就像我在本地运行时一样。

关于我可能遗失的任何想法?

这是我的WCF服务的配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    <add key="Separator" value="*"/>
  </appSettings>
  <system.web>
    <compilation targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms" />
    <customErrors mode="Off"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="QueueService.QueueLogService">
        <host>
          <baseAddresses>
            <add baseAddress="https://dev.app.services.domain/QueueService" />
          </baseAddresses>
        </host>

        <endpoint address="net.msmq://dev.app.services.domain/private/QueueService/QueueLogService.svc" binding="netMsmqBinding" bindingConfiguration="myBinding" contract="QueueService.IQueueLogService">
          <identity>
            <dns value="dev.app.services.domain" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>

      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <bindings>
      <netMsmqBinding>
        <binding name="myBinding">
          <security mode="None"></security>
        </binding>
      </netMsmqBinding>
      <basicHttpBinding>
        <binding name="Secure">
          <security mode="Transport" />
        </binding>
      </basicHttpBinding>

    </bindings>

  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false `enter code here`before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true" />
  </system.webServer>

</configuration>

0 个答案:

没有答案