gpt4 book ai didi

具有相对路径的 Asp.net 自托管 WCF 服务 WSDL

转载 作者:行者123 更新时间:2023-12-02 11:25:00 28 4
gpt4 key购买 nike

我正在开发一个 WCF 应用程序,该应用程序将一路部署到各种服务器,我希望不必记住每次部署时都更改 app.config。起初,我的 app.config serviceModel 部分如下所示:

<system.serviceModel>  
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" />
<behaviors>
<serviceBehaviors>
<behavior name="MyDefaultServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8888/MyService" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MyDefaultServiceBehavior" name="MyService">
<endpoint address="net.tcp://localhost:9001/MyService" binding="netTcpBinding" contract="IMyService" name="NetTcpBinding_IMyService" />
</service>
</services>

当我访问本地计算机上运行的服务时,这在开发中工作得很好。当我部署它时,WSDL 包含仍然指向 localhost 的绝对路径:

<xsd:import schemaLocation=http://localhost:8888/MyService?xsd=xsd0 namespace="http://tempuri.org/" />

所以,我可以像这样更改 app.config 中的 httpGetUrl:

<serviceMetadata httpGetEnabled="true" httpGetUrl=http://devserver1:8888/MyService />

现在 wsdl 在该服务器上可以正常工作。问题是我必须在部署的每个 app.config 中手动设置地址。

有没有办法:
1. wsdl 是否已包含所有内容以便无需导入?

2. 在wsdl import 语句中使用相对路径?

或者任何其他建议,我们将不胜感激。我有两台开发服务器,部署是自动进行的,只要不是因为这个 wsdl 问题就好了。

由于这仅用于生成代理,因此我想我可以自己生成代理并分发它,但我宁愿让用户自己生成代理。

谢谢!丹尼尔

最佳答案

您可以设置httpGetUrl的值以编程方式并将其设置为一个绝对地址,其中包括托管服务的服务器的计算机名称。生成的 WSDL 中的导入语句也将使用服务器的计算机名称。

如果正在为您创建 WCF 主机(例如,您在 IIS 下托管),那么您将需要创建自定义 ServiceHostFactory访问 ServiceHost 。例如:

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Description;

namespace WebApplication
{
public class TestServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType,
Uri[] baseAddresses)
{
ServiceHost host = base.CreateServiceHost(serviceType,
baseAddresses);
ServiceMetadataBehavior metadataBehavior =
new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
metadataBehavior.HttpGetUrl = new Uri(string.Format(
"http://{0}/WebApplication/TestService.svc",
Environment.MachineName));
host.Description.Behaviors.Add(metadataBehavior);
return host;
}
}
}

然后您在服务的 .svc 文件中指定该工厂:

<%@ ServiceHost Language="C#" 
Service="WebApplication.TestService"
CodeBehind="TestService.svc.cs"
Factory="WebApplication.TestServiceHostFactory" %>

如果您自己创建 WCF 主机,那么您的代码将如下所示:

ServiceHost host = new ServiceHost(typeof(WebApplication.TestService));
ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
metadataBehavior.HttpGetUrl = new Uri(string.Format(
"http://{0}/WebApplication/TestService.svc",
Environment.MachineName));
host.Description.Behaviors.Add(metadataBehavior);

关于具有相对路径的 Asp.net 自托管 WCF 服务 WSDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/587609/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com