2011-11-15 34 views
0

我一直在WAS下实现NetTcp绑定和元数据方面取得了成功,但是我在WAS/IIS下的netMsmqBinding存在问题。简而言之,我可以将MEX实施为自托管的NetMsmq绑定应用程序,但不适用于WAS/IIS。看起来WAS拒绝使用我自己托管的应用程序中的任何地址的地址。换句话说,我可以在自托管做到这一点:WCF - 无法生成元数据/实施MEX NetMsmq绑定IIS下?

<system.serviceModel> 
    <services> 
     <service name="Microsoft.Samples.MSMQTransactedSample.OrderProcessorService" behaviorConfiguration="OrderProcessorServiceBehavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8000/ServiceModelSamples/service" /> 
      </baseAddresses> 
     </host> 
     <!-- Define NetMsmqEndpoint --> 
     <endpoint address="net.msmq://localhost/private/ServiceModelSamplesTransacted" binding="netMsmqBinding" bindingConfiguration="TransactedBinding" contract="Microsoft.Samples.MSMQTransactedSample.IOrderProcessor" /> 
     <!-- the mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex --> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="OrderProcessorServiceBehavior"> 
      <serviceMetadata httpGetEnabled="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <netMsmqBinding> 
     <binding name="TransactedBinding"> 
      <security mode="None" /> 
     </binding> 
     </netMsmqBinding> 
    </bindings> 
    </system.serviceModel> 

Hoever,当我尝试类似的东西在WAS,它说没有终点lisening地址8000它不会举办metdata。有人可以帮助我获取元数据或在WAS中为NetMsmq实施MEX:

<system.serviceModel> 
    <bindings> 
     <netMsmqBinding> 
     <binding name="MsmqBindingNonTransactionalNoSecurity" exactlyOnce="false"> 
      <security mode="None"/> 
     </binding> 
     </netMsmqBinding> 
    </bindings> 
    <services> 
     <service name="Portal.LoadSim.Services.MsmqService" behaviorConfiguration="PortalServiceBehavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8000/PortalLoadSimServices10/MsmqService"/> 
      </baseAddresses> 
     </host> 
     <!-- Define NetMsmqEndpoint --> 
     <endpoint address="net.msmq://localhost/private/PortalLoadSimServices10/MsmqService.svc" binding="netMsmqBinding" bindingConfiguration="MsmqBindingNonTransactionalNoSecurity" contract="Portal.LoadSim.Shared.IMsmqService" /> 
     <!-- the mex endpoint is exposed at http://localhost:8000/PortalLoadSimServices10/MsmqService/mex --> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 

     </service> 

    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="PortalServiceBehavior"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="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="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

回答

0

您需要为您的服务添加URL访问控制。这个命令应该为你工作:

netsh http add urlacl url=http://localhost:8000/PortalLoadSimServices10/MsmqService user="NT AUTHORITY\NetworkService" listen=yes 

要删除的条目

delete urlacl url=http://localhost:8000/PortalLoadSimServices10/MsmqService 

HTH

UPDATE:这不是前面回答您的问题。如果您希望将这些服务作为自托管应用程序运行并在非标准帐户下运行,那么您将执行此操作。对不起,我把它弄混了。我尝试在家中的示例应用程序上使用您的配置,发现我必须做两件事情才能使其运行 - 其一,我必须将队列重命名为svc文件的路径和名称(例如,PortalLoadSimServices10/MsmqService.svc)而不是使用基地址,只需浏览IIS主机应用程序中的svc文件即可。您可能还需要修改队列权限,以便iis可以正确访问它。让我知道这是否解决了你的问题。

+0

相同的错误 - 下载'http:// localhost:8000/PortalLoadSimServices10/MsmqService/mex /'时出错无法连接到远程服务器由于目标机器主动拒绝它,因此无法建立连接127.0.0.1 :8000。在http:// localhost:8000/PortalLoadSimServices10/MsmqService/mex /上没有可以接受消息的端点。这通常是由不正确的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。 –

+0

我尝试将服务引用添加到http:// localhost:8000/PortalLoadSimServices10/MsmqService/mex –

+0

删除urlacl条目并尝试将完整地址添加到您的元数据,包括mex(这不在我放入帖子的命令中)。 – stephenl