ipaddress:port vs localhost:port 在 IIS 7 上使用 WCF 托管 Silverli

本文关键字:port WCF Silverli 托管 IIS vs localhost ipaddress | 更新日期: 2023-09-27 17:55:57

这可能很简单,但请耐心等待。

当我使用简单的复制和粘贴技术将带有 WCF 的 Silverlight 5 应用程序部署到 IIS 时,我可以完美地浏览网站,但是当我尝试通过 IP 地址访问它时,如下所示 192.168.1.3:8099,每个服务调用都会返回如下错误:

An exception occurred during the operation, making the result invalid.  Check InnerException for exception details.
  at .....
  at <MyNamespace>.OnGetSomethingFromDataBaseCompleted(Object state)

我可以成功地将来自其他计算机的 WCF 服务作为目标 (192.168.1.3:8099/SomeService.svc)。我编写了测试控制台应用程序来调用(并关闭)服务,它正确地从远程DBServer获取了一些数据。然而在浏览器中什么都没有。

当导航到 192.168.1.3:8099 时,应该从浏览器添加回来 Fiddler 不会注册此调用,但它会从 localhost:8099 注册。

你能帮忙吗?

我认为对于比我更有经验的部署的人来说,这是一个简单的问题,但如果您认为应该这样做,请继续阅读。


所以你正在阅读=>(棱镜)。

我有一个连接到调用WCF服务的数据库的Silverlight应用程序(添加为Silverlight WCF服务 - VSTemplate)。

在这个应用程序中,我介绍了Prism,就像Jeremy Likness在他的博客上建议的那样

我还使用 Web 代理从 ViewModel 访问 WCF 服务。

我的项目结构:

  • 网页项目
  • SilverlightAppWithShell
  • 模块A
  • 模块B
  • 共同项目

部署目录结构:

C:''inetpub''wwwroot''MyAppFolder (IISUsers have accessToIt)

  • .''bin''AllDlls
  • .''ClientBin''AllXapFiles(来自上述所有项目的 XAP 文件)
  • ''
  • 服务''所有 *.cs 定义服务操作协定的文件
  • .
  • ''Web.config
  • .''测试页.html
  • .''测试页面.aspx
  • .''银光.js
  • .''AllServices *.scv 文件

最后但并非最不重要的一点是

  • .''客户端访问策略.xml

其中包含以下代码:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>"
      </allow-from>
      <grant-to>
        <resource path="/Services" include-subpaths="true"/><!--I tried with App_Code here when renaming Services dir to App_Code with the same wain result-->
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

感谢您的阅读

ipaddress:port vs localhost:port 在 IIS 7 上使用 WCF 托管 Silverli

这就是我最终所做的并解决了我的问题,遵循卡洛斯·菲盖拉的这篇文章。我不确定 Silverlight 5 是否有更好的解决方案,但它对我有用。

public static void UpdateMyServiceAddress(WebServiceMyProxies.MyServiceClient client)
        {
            client.Endpoint.Address = UpdateServiceAddress(client.Endpoint.Address.Uri.ToString());
        }
private static System.ServiceModel.EndpointAddress UpdateServiceAddress(string originalAddress)
        {
            int svcIndex = originalAddress.IndexOf(".svc");
            int serviceNameIndex = originalAddress.LastIndexOf('/', svcIndex);
            string serviceName = originalAddress.Substring(serviceNameIndex + 1);
            string baseAddress = Application.Current.Host.Source.ToString();
            baseAddress = baseAddress.Substring(0, baseAddress.LastIndexOf('/')); // removing /App.xap
            baseAddress = baseAddress.Substring(0, baseAddress.LastIndexOf('/')); // removing /ClientBin
            return new System.ServiceModel.EndpointAddress(String.Format("{0}/{1}/{2}", baseAddress,"Services", serviceName));
        }