WCF 服务主机和 Silverlight 5 通过 net.tcp 的跨域策略文件

2023-11-29

我有一个本地托管的 WCF 服务和一个与之通信的 silverlight 5 应用程序。默认情况下,silverlight 在调用 WCF 服务时尝试通过 HTTP 获取跨域策略文件。我需要更改此设置,以便策略文件通过 net.tcp 端口 943 提供服务。

我已经设置了一个本地 tcp 监听器,它通过端口 943 提供策略文件,并且我有遵循了这个技术我建立了一个虚拟套接字连接,以便通过 TCP 获取策略文件,因为每个应用程序生命周期仅检索一次该文件。 tcp 服务器按预期受到攻击,我得到SocketError财产价值为Success(尽管我必须注意,启动侦听器后第一次访问 TCP 服务器时,结果始终是访问被拒绝)。

据我所知,策略文件要么无效,因为 silverlight 应用程序仍然无法连接,要么上述技术不适用于 silverlight 5。

我想知道的是我正在做的事情是否可行并且我做得正确,否则是否有其他方法可以通过 tcp 成功下载策略文件并消除通过 HTTP 检索它的需要。

Thanks


我写了一篇关于在 WPF 中托管 silverlight 以及将 WCF 与 http 侦听器一起使用的长文:

如何在 WPF 4 应用程序中托管 Silverlight 4 应用程序?

现在,虽然没有直接回答您的问题,但它确实展示了如何创建策略文件的 http 版本。

我还写了一些通过端口 943 提供策略侦听器的东西,但我找不到发布源代码的位置 - 所以我会继续挖掘。据我所知,silverlight 对策略文件进行级联查找,如果它在端口 80 上没有获得连接,它将在端口 943 上查找。

我希望这对某些地方有帮助。

好的,这是我用于 net.TCP 传输的策略侦听器,即不是基于 HTTP 的。我想您现在已经解决了这个问题,抱歉耽搁了。现在它可能对其他人有用。

我一直在寻找 MS 的东西,说它们从 HTTP 级联到 TCP,但是,我不能,因此不得不假设它是废话,然后又改变了。

无论哪种方式,如果您使用 net.TCP 服务进行调用,并且想要它的侦听器,则以下代码应该有所帮助:

#region "Policy Listener"

// This is a simple policy listener
// that provides the cross domain policy file for silverlight applications
// this provides them with a network access policy
public class SocketPolicyListener
{

    private TcpListener listener = null;
    private TcpClient Client = null;
    byte[] Data;
    private NetworkStream netStream = null;

    private string listenaddress = "";

    // This could be read from a file on the disk, but for now, this gives the silverlight application
    // the ability to access any domain, and all the silverlight ports 4502-4534
    string policyfile = "<?xml version='1.0' encoding='utf-8'?><access-policy><cross-domain-access><policy><allow-from><domain uri='*' /></allow-from><grant-to><socket-resource port='4502-4534' protocol='tcp' /></grant-to></policy></cross-domain-access></access-policy>";

    // the request that we're expecting from the client
    private string _policyRequestString = "<policy-file-request/>";

    // Listen for our clients to connect
    public void Listen(string ListenIPAddress)
    {
        listenaddress = ListenIPAddress;
        if (listener == null)
        {
            listener = new TcpListener(IPAddress.Parse(ListenIPAddress), 943);

            // Try and stop our clients from lingering, keeping the socket open:
            LingerOption lo = new LingerOption(true, 1);
            listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger,lo);
        }

        listener.Start();

        WaitForClientConnect();
    }

    private void WaitForClientConnect()
    {
        listener.BeginAcceptTcpClient(new AsyncCallback(OnClientConnected), listener);
    }

    public void StopPolicyListener()
    {
        if (Client.Connected)
        {
            // Should never reach this point, as clients
            // are closed if they request the policy
            // only clients that open the connection and
            // do not submit a policy request will remain unclosed
            Client.Close();
        }

        listener.Stop();
    }

    public void RestartPolicyListener()
    {
        listener.Start();
    }

    // When a client connects:
    private void OnClientConnected(IAsyncResult ar)
    {
        if (ar.IsCompleted)
        {
            // Get the listener that handles the client request.
            TcpListener listener = (TcpListener)ar.AsyncState;

            // End the operation and display the received data on 
            // the console.
            Client = listener.EndAcceptTcpClient(ar);

            // Try and stop our clients from lingering, keeping the socket open:
            LingerOption lo = new LingerOption(true, 1);
            Client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, lo);

            // Set our receive callback     
            Data = new byte[1024];
            netStream = Client.GetStream();
            netStream.BeginRead(Data, 0, 1024, ReceiveMessage, null);
        }

        WaitForClientConnect();
    }

    // Read from clients.
    public void ReceiveMessage(IAsyncResult ar)
    {
        int bufferLength;
        try
        {
            bufferLength = Client.GetStream().EndRead(ar);

            // Receive the message from client side.
            string messageReceived = Encoding.ASCII.GetString(Data, 0, bufferLength);

            if (messageReceived == _policyRequestString)
            {
                // Send our policy file, as it's been requested
                SendMessage(policyfile);

                // Have to close the connection or the
                // silverlight client will wait around.
                Client.Close();
            }
            else
            {
                // Continue reading from client. 
                Client.GetStream().BeginRead(Data, 0, Data.Length, ReceiveMessage, null);
            }
        }
        catch (Exception ex)
        {
            throw new Exception(Client.Client.RemoteEndPoint.ToString() + " is disconnected.");
        }
    }

    // Send the message.
    public void SendMessage(string message)
    {
        try
        {
            byte[] bytesToSend = System.Text.Encoding.ASCII.GetBytes(message);
            //Client.Client.Send(bytesToSend,SocketFlags.None);
            Client.GetStream().Write(bytesToSend,0, bytesToSend.Length);
            Client.GetStream().Flush();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}
#endregion
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WCF 服务主机和 Silverlight 5 通过 net.tcp 的跨域策略文件 的相关文章

随机推荐

  • 如何将 CString 和 std::string std::wstring 相互转换?

    CString非常方便 同时std string与STL容器更加兼容 我在用hash map 然而 hash map不支持CStrings 作为键 所以我想转换CString into a std string 写一个CString哈希函数
  • 如何获取 ASP.NET 应用程序的根文件夹

    我正在尝试获取应用程序的根文件夹 我使用了以下代码 但这给出了bin文件夹 但我需要的是应用程序的根文件夹 有可能得到这个吗 This is the full directory and exe name String fullAppNam
  • 这个 php 结构是什么意思:$html->redirect("URL")?

    我在 php 的其他地方看到过这个 gt 我以前学PHP的一本书里有这个 但是从来没有解释过 它有什么作用 如何工作 我知道重定向位 但是 html 变量和重定向函数发生了什么 提前致谢 注意 如果您不知道 对象 是什么 则下一段可能没有意
  • 如何使用executemany将Python中的字典列表插入MySQL

    我目前正在使用 MySQL 和 Python 从网络上抓取数据 具体来说 我正在抓取表数据并将其插入到我的数据库中 我当前的解决方案有效 但我觉得它效率极低 如果我不重写代码 很可能会锁定我的数据库 这是我目前使用的 部分代码 itemBa
  • 如何使用Python 3登录SAPGUI?

    我正在尝试使用 Python 登录 SAPGUI 以便创建一个脚本来自动运行事务 但我遇到了问题 每当我尝试登录时 我都会收到
  • 如何在RelativeLayout之外或屏幕之外显示一个ImageView?如何在屏幕左上角显示橡胶

    我已经设置了一个相对视图 其中包含所有元素 按钮 图像等 这是我的 Android 应用程序的标题页 现在我想在整个布局的左上角覆盖 LITE 横幅 我的问题是 LITE 横幅图像是一个倾斜的红色橡胶 我需要将其左上角点设置为屏幕上的 45
  • VS2013中如何让项目继承另一个项目的设置?

    我想创建一个本机 C 项目 它从同一解决方案中的另一个本机 C 项目继承其设置 因此 如果我要更改基础项目的设置 它将反映在派生项目中 这可能吗 我使用 继承 这个词是因为我在项目设置中看到了这一点 尽管我不确定它是从哪里继承的 项目设置共
  • Spyder anaconda 在 Linux 上因分段错误而崩溃

    我刚刚在 Linux 上安装了 Anaconda 当尝试打开spyder 从导航器或终端 时 它不起作用 当我尝试在终端中打开它时 出现以下错误 分段错误 核心转储 我完全更新了Conda 但无法解决问题 我使用的是 Conda 版本 4
  • 说<有什么用?扩展 SomeObject> 而不是

    所以我正在查看一些 Java 代码并偶然发现 List
  • 如何通过多线程代码python提高Webscraping代码速度

    下面是我的代码 我在其中逐行编写 大约有900页 10行 每行5个数据 有什么办法可以让它更快吗 目前正在采取80 min将数据导出到 csv 中 有什么方法可以向页面发出并行请求并使此代码更高效 import requests from
  • ManyToMany 字段的 Django 自定义小部件

    有谁知道有一个显示 2 个选择框的小部件 一个显示模型中所有对象的列表 另一个显示已选择的对象 然后 用户可以从第一个列表中选择一个对象 单击 gt gt 按钮将其移动到 选定 列表 然后 当保存表单时 所选列表中的对象将保存在多对多字段中
  • 使用 JQ 替换 JSON 模板中的变量

    我想用值 Hello Jack 填充 json 模板 但 Hello 部分应保留在模板内 有什么方法可以做到这一点 我尝试了下面的代码 但它给了我错误 jq n arg person Jack my key Hello person jq
  • C# 判断文件是否被修改的方法

    我想在对文件进行一些修改后提示用户保存文件 但问题是我一生都无法这样做 有些人建议使用FileInfo类 但它只给你lastWriteTime LastAccessTime and CreationTime 我想用FileInfo类而不是F
  • Android 中 getResources() 的实现

    我刚刚开始学习android编程 我对getResources 方法产生了疑问 我注意到 当我创建一个 Resources 对象时 我所要做的就是 Resources res getResources 第一个疑问是为什么我必须这样做并且我不
  • 如何从facebook sdk获取用户生日?

    如何通过以下方式获取用户生日user getBirthday Session openActiveSession this true new Session StatusCallback callback when session chan
  • 处理 vimrc 时检测到错误: - 如何在 vim 中获取 pugins

    今天我正在制作自定义 vimrc 但它给了我这个错误 它不允许我使用任何插件 有人可以帮助告诉我做错了什么吗 这些行是它显示的错误 E117 Unknown function plug begin line 10 E492 Not an e
  • 无法安装react-beautiful-dnd包

    以下是安装包时的完整错误堆栈消息 npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR While resolvin
  • 用户更新标签后渲染 Highcharts

    我正在尝试创建一个图表生成器 我有用户输入的图例标题和位置 我希望用户输入标题 当单击 模糊 时 图表将根据他们输入的内容进行更新 问题是图表第一次渲染 但是我永远无法让字符再次渲染 这是代码的快速摘要 legendlocation sel
  • 根据验证程序,远程证书无效[重复]

    这个问题在这里已经有答案了 运行以下代码 我得到一个异常 using var client new Pop3Client client Connect provider ServerWithoutPort provider Port tru
  • WCF 服务主机和 Silverlight 5 通过 net.tcp 的跨域策略文件

    我有一个本地托管的 WCF 服务和一个与之通信的 silverlight 5 应用程序 默认情况下 silverlight 在调用 WCF 服务时尝试通过 HTTP 获取跨域策略文件 我需要更改此设置 以便策略文件通过 net tcp 端口