我有一个在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>
任何人都可以提供帮助吗?
答案 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,请勿启动此策略服务,因为这将接管此地址: - )
希望能让你朝着正确的方向前进: - )