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>
感谢您的阅读
这就是我最终所做的并解决了我的问题,遵循卡洛斯·菲盖拉的这篇文章。我不确定 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));
}