现在几天都在寻找这个问题的解决方案,并且无法找到解决我确切问题的方法。基本上,我有一个我写的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>