是否可以让在ASPX中运行的WCF客户端通过net.pipe在同一台机器上的另一个站点中调用SVC?

时间:2014-04-15 21:24:32

标签: wcf netnamedpipebinding net.pipe

我有两个网站 - 一个带有aspx文件,一个带有两个端点的wcf服务,一个http和一个命名管道。它们都运行在同一台机器上,所以它们似乎是使用net.pipe绑定的候选者。

aspx文件创建一个服务客户端并尝试调用net.pipe。我明白了:

  

"' / dev'中的服务器错误应用。消息不可能   因为端点地址处的服务而被调度   ' net.pipe://本地主机/ netNamedPipeBinding'是不可用的   地址协议。"

Google搜索提示这可能是一个安全问题(没有权限错误与没有侦听器错误相同),但我已经将[NETWORK]用户组的NTFS权限授予了包含这些服务的网站文件,但没有变化

使用aspx的网站使用Forms身份验证(即不是Windows身份验证),服务网站是匿名身份验证。 web.config的net.pipe安全性设置为="无"

在本地,这很好用 - 虽然我必须在控制台应用程序中运行命名管道主机,因为Visual Studio Dev Server不能执行命名管道。此外,Http端点在IIS上运行正常。

它运行的是.NET 4.0,IIS 7.5,Win2008。

IIS配置 据我所知,

  • net.pipe已启用服务网站,配置信息为*
  • 已安装并启用WAS(通过Windows功能)
  • 启用了net.pipe侦听器Windows服务。
  • 每个网站都是匿名访问(auth由服务器上的第三方单点签名完成)
  • 每个网站都有自己的应用程序池(可能不相关)
  • 服务网站处于网络园林模式(可能不相关)

服务配置(在同一台计算机上的IIS上运行,不同的VDIR)

<system.serviceModel>
    <bindings>
        <netNamedPipeBinding>
            <binding name="netNamedPipeBindingConfig" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
            hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
            maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport protectionLevel="EncryptAndSign" />
                </security>
            </binding>
        </netNamedPipeBinding>
    </bindings>
    <services>
        <service name="MyService">
            <host>
                <baseAddresses>
                    <add baseAddress="net.pipe://localhost/" />
                </baseAddresses>
            </host>
            <endpoint
                         address="netNamedPipeBinding"
                         bindingConfiguration="netNamedPipeBindingConfig"
                         binding="netNamedPipeBinding"
                         contract="IMyService" >
            </endpoint>
        </service>
    </services>
    <serviceHostingEnvironment  multipleSiteBindingsEnabled="true" />
</system.serviceModel>

客户端配置(ASP.NET网站,同一台计算机,与服务不同的VDIR)

    <system.serviceModel>
    <bindings>
        <netNamedPipeBinding>
            <binding name="NetNamedPipeBinding_IMyService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
                maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport protectionLevel="EncryptAndSign" />
                </security>
            </binding>
        </netNamedPipeBinding>
    </bindings>
    <client>
        <endpoint
                address="net.pipe://localhost/netNamedPipeBinding"
                binding="netNamedPipeBinding"
                bindingConfiguration="NetNamedPipeBinding_IMyService"
                contract="MyService.IMyService"
                name="NetNamedPipeBinding_IMyService">
        </endpoint>
    </client>
</system.serviceModel>

(改变服务和合同名称以保护无辜者)

C#并不特别,只有Add-Service-Reference生成的代理。 (并且所有代码都适用于wsHttp绑定

1 个答案:

答案 0 :(得分:1)

当以这种方式在IIS中托管命名管道时,无法设置它的基址。结果,客户端无法找到该服务。请在此处查看答案以获取更多详细信息: controlling-the-name-of-a-named-pipe-when-hosting-wcf-net-pipe-binding-in-iis