我一直在尝试使用WCF进行MSMQ,但我似乎无法让它正常工作.通过使用WCF和服务引用,我得到了客户端(它向队列发送消息).执行此操作的代码或多或少是这样的:
static void Main(string[] args)
{
var client = new MsmqServiceReference.MsmqContractClient();
client.SendMessage("TEST");
client.Close();
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
其中MsmqContractClient是我添加服务引用时由visual studio生成的代理.app.config中的端点指向msmqueue:
<client>
<endpoint
address="net.msmq://localhost/private/MsmqService/MsmqService.svc"
binding="netMsmqBinding"
bindingConfiguration="MsmqBindingNonTransactionalNoSecurity"
contract="MsmqServiceReference.IMsmqContract" name="MsmqService" />
</client>
Run Code Online (Sandbox Code Playgroud)
这样可以将消息发布到队列中.
现在我试图让服务真正起作用,但我一直收到这个错误:
绑定验证失败,因为绑定的MsmqAuthenticationMode属性设置为WindowsDomain但安装了MSMQ且禁用了Active Directory集成.无法打开通道工厂或服务主机.
我尝试过的事情是:
为每个人提供对队列的完全访问权限(包括匿名登录)
使用以下命令配置应用程序以使用配置文件中的特定绑定:
<bindings>
<netMsmqBinding>
<binding name="MsmqBindingNonTransactionalNoSecurity"
deadLetterQueue="Custom"
exactlyOnce="false">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)我尝试在我自己的帐户和管理员帐户下运行IIS(7)中的应用程序池
让我感到困惑的是,它一直试图说服我,我正在尝试使用WindowsDomain身份验证来运行它.我声明我不想在安全模式设置为none的情况下这样做,对吗?
我的应用程序目前只是一个webforms asp.net网站,其中添加了WCF服务.
如果有人能够至少指出我正确的方向,我将非常感激,因为我已经花了太多时间在这上面.
看起来似乎忽略或覆盖了配置.完整的错误消息:
WebHost failed to process a request.
Sender Information: System.ServiceModel.Activation.HostedHttpRequestAsyncResult/63721755
Exception: System.ServiceModel.ServiceActivationException: The service '/MsmqService/MsmqService.svc' cannot be activated due to an exception during compilation. The exception message is: Binding validation failed because the binding's MsmqAuthenticationMode property is set to WindowsDomain but MSMQ is installed with Active Directory integration disabled. The channel factory or service host cannot be opened.. ---> System.InvalidOperationException: Binding validation failed because the binding's MsmqAuthenticationMode property is set to WindowsDomain but MSMQ is installed with Active Directory integration disabled. The channel factory or service host cannot be opened.
at System.ServiceModel.Channels.MsmqVerifier.VerifySecurity(MsmqTransportSecurity security, Nullable`1 useActiveDirectory)
at System.ServiceModel.Channels.MsmqVerifier.VerifyReceiver(MsmqReceiveParameters receiveParameters, Uri listenUri)
at System.ServiceModel.Channels.MsmqTransportBindingElement.BuildChannelListener[TChannel](BindingContext context)
at System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener[TChannel]()
at System.ServiceModel.Channels.MessageEncodingBindingElement.InternalBuildChannelListener[TChannel](BindingContext context)
at System.ServiceModel.Channels.BinaryMessageEncodingBindingElement.BuildChannelListener[TChannel](BindingContext context)
at System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener[TChannel]()
at System.ServiceModel.Channels.Binding.BuildChannelListener[TChannel](Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, BindingParameterCollection parameters)
at System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(Boolean actuallyCreate, Type[] supportedChannels, Binding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, ServiceThrottle throttle, IChannelListener& result, Boolean supportContextSession)
at System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& result)
at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost)
at System.ServiceModel.ServiceHostBase.InitializeRuntime()
at System.ServiceModel.ServiceHostBase.OnBeginOpen()
at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open()
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
--- End of inner exception stack trace ---
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result)
Process Name: w3wp
Process ID: 5660
Run Code Online (Sandbox Code Playgroud)
我尝试弄清楚使用Reflector会发生什么,但它似乎只是某种方式将MsmqTransportBindingElement传递到通道构建过程中,它确信它必须使用WindowsDomain作为安全措施.但是,我的配置文件中的安全性设置为none.关于这种覆盖行为来自哪里的任何想法?
解析度:
一方面我觉得很愚蠢,但另一方面我觉得还有改进的余地.简短的版本是我搞砸了service元素的'name'属性中的值:
<services>
<service name="WcfService.MsmqService">
<!-- <endpoint binding="mexHttpBinding" contract="IMetadataExchange" />-->
<endpoint name="msmq"
address="net.msmq://localhost/private/MsmqService/MsmqService.svc"
binding="netMsmqBinding"
bindingConfiguration="NoSecurity"
contract="WcfService.IMsmqContract" />
</service>
</services>
Run Code Online (Sandbox Code Playgroud)
该名称与我的客户端相同,但客户端具有visual studio生成的绑定.我给它一个不同的名称(MsmqService),因此名称值为'MsmqService.MsmqService'.
什么样的困扰我是我没有得到任何警告,我正在配置一个不存在的服务,或任何迹象我正在使用该服务的默认配置.如果框架至少会在我使用默认值的地方生成警告,或者打开某种形式的严格模式的选项,那将是非常好的.无论哪种方式,感谢您的所有投入,我将再次撞墙几下.
是的,你现在可以指点笑;-)
尝试这些设置... useActiveDirectory默认情况下应为false,但请尝试一下.验证模式在传输本身msmqAuthenticationMode上设置,因此应设置为"无". msmqProtectionLevel与clientCredentialType声音相关的,所以我在那里把他们也
:)
<bindings>
<netMsmqBinding>
<binding name="MsmqBindingNonTransactionalNoSecurity"
deadLetterQueue="Custom"
useActiveDirectory="false"
exactlyOnce="false">
<security mode="None">
<transport
msmqAuthenticationMode="None"
msmqProtectionLevel="None"
clientCredentialType="None"/>
</security>
</binding>
</netMsmqBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)
我会担心删除所有安全性,但是......如果您在域中,则应该使用Active Directory集成安装MSMQ,或使用工作组方法保护消息.
另外,请不要忘记,服务器和客户端的设置必须匹配.
HTH,
詹姆斯
对于不断更新,我今天对细节的关注似乎有点低
:P
| 归档时间: |
|
| 查看次数: |
8920 次 |
| 最近记录: |