SilverLight连接到Windows服务中托管的Net Tcp WCF

时间:2012-12-30 12:06:46

标签: wcf silverlight windows-services nettcpbinding clientaccesspolicy.xml

我有一个在Windows服务中托管的WCF服务

它使用NetTCPBinding,我可以连接,我想实现新的Silverlight客户端来访问服务

我已经完成了添加服务引用的常规方法,并添加了空“ServiceReferences.ClientConfig”

所以我查看了一些主题和主题,最后我手动为服务编写了我的配置

当我尝试连接时显示此异常 无法连接到net.tcp:// localhost:4502 / MyService / Service。连接尝试持续时间跨度为00:00:02.2111265。 TCP错误代码10013:尝试以其访问权限禁止的方式访问套接字。这可能是由于尝试以跨域方式访问服务而未将服务配置为跨域访问。您可能需要联系服务所有者以通过HTTP公开套接字跨域策略,并在允许的套接字端口范围4502-4534中托管服务。

我认为该问题与ClientAccessPolicy.xml文件相关

搜索后人们说我需要安装IIS7并且可以通过它访问文件,我试过这个但是我无法使其工作

但是,我之前已经处理过这个问题,但我使用的是PollinghttpBinding no NetTCP,并且我创建了另一个服务合同来返回ClientAccessPolicy文件

我曾尝试使用PollinghttpBinding做同样的事情,但我无法编写正确的服务配置

我的客户拒绝使用IIS,所以我可以使用这种方式,我应该使用这项服务的正确配置是什么?

这是我用于服务的配置

<service behaviorConfiguration="serviceBehavior" name="MyService">
              <endpoint address="net.tcp://localhost:4502/MyService/Service"       behaviorConfiguration="endpointBehavior" binding="netTcpBinding"         bindingConfiguration="netTcpServiceBinding" contract="IMyService">
                  <identity>
                      <dns value="localhost"/>
                  </identity>
              </endpoint>
              <endpoint address="net.tcp://localhost:7000/MyService/mex"     binding="mexTcpBinding" contract="IMetadataExchange"/>
          </service>

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:0)

Silverlight中不支持Net -tcp绑定“开箱即用”。这就是配置为空的原因。但无论如何,您可以使用customBinding并设置所需的属性。但是,我从来没有试过这个自己。

如果这是一个跨域问题,那么这与ClientAccessPolicy.xml文件有关。 通常(如各种论坛上的许多地方所述),这可以通过将文件放在站点的根目录中来解决。因此,如果您的服务在“http:// localhost / MyService”上运行,则该文件应该放在“http:// lovalhost”中。

但是,如果没有可用的IIS,则必须采用另一种方式。您必须在Windows服务中手动在根上创建端点,此文件可用。 这是一个普通的BasicHttp绑定,你可以使用“net.tcp”或“http”。

我通过这种方式取得了成功:

政策界面:

using System;
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace MyPolicyService
{
    [ServiceContract]
    public interface IPolicyRetriever
    {
        [OperationContract]
        Stream GetPolicy();
    }
}

政策类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ServiceModel.Web;

namespace MyPolicyService
{
    public class PolicyRetrieverBase : IPolicyRetriever
    {
        public Stream StringToStream(String result)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }

        public Stream GetSilverlightPolicy()
        {
            string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from http-request-headers=""*"" http-methods=""*"">
                <domain uri=""*""/>
            </allow-from>
            <grant-to>
                <resource path=""/"" include-subpaths=""true""/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>";

            return StringToStream(result);
        }

        public Stream GetFlashPolicy()
        {
            string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
<cross-domain-policy>
    <site-control permitted-cross-domain-policies=""all""/>
    <allow-access-from domain=""*"" secure=""false"" />
    <allow-http-request-headers-from domain=""*"" headers=""*"" secure=""false"" />
</cross-domain-policy>";

            return StringToStream(result);
        }
    }
}

创建这些类时,几乎就像启动“net.tcp”服务一样创建服务,但当然将其更改为BasicHttpBinding并使用与BasicHttpBinding相关的一些不同行为和属性值(如TransferMode = Buffered)等)。

不用说,这个策略服务应该在站点根目录(http:// localhost)上启动。 ID您在此服务器上运行IIS,请勿启动此策略服务,因为这将接管此地址: - )

希望能让你朝着正确的方向前进: - )