Jav*_*abe 6 c# wsdl web-services
我在部署在Windows服务EXE中的C#中创建了一个WCF Web服务,该服务基本上按照我想要的方式工作.我以自托管的方式使用它(不在IIS中).
为了使WSDL文件可用于调用Java Web服务,我将ServiceMetadataBehavior添加到主机创建中.即:
ServiceHost host = new ServiceHost(typeof(MyService));
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Run Code Online (Sandbox Code Playgroud)
这一切都运行良好,直到我将我的服务移动到具有不同主机名的另一台服务器.当我连接到WSDL(http:// prod-server:55000/MyService?wsdl)时,我看到开发服务器的主机名在WSDL中是硬编码的.
以下是浏览器中的WSDL片段:
<wsdl:definitions name="MyService" targetNamespace="http://tempuri.org/">
<wsdl:import namespace="MyProject.ServiceContracts" location="http://dev-server:55000/MyService?wsdl=wsdl0"/>
<wsdl:types/>
Run Code Online (Sandbox Code Playgroud)
我检查了项目中的所有C#代码,并且开发服务器名称没有在任何地方进行硬编码.
在App.config文件中,我定义了以下内容:
<system.serviceModel>
<services>
<service name="MyService">
<endpoint address="http://localhost:55000/MyService" binding="basicHttpBinding"
bindingConfiguration="" contract="MyProject.ServiceContracts.IMyInterface" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:55000/MyService" />
</baseAddresses>
</host>
</service>
</services>
Run Code Online (Sandbox Code Playgroud)
我希望这会导致localhost机器名被替换,但它仍然作为最初创建/部署服务的开发盒名称而存在.我错了吗?
我还研究了明确指定WSDL文件路径的可能性,但从我可以推断的内容来看,只有在IIS上托管服务时才能这样做.
最后,纯粹是出于好奇,我想知道实际的WSDL文件是否真的被创建(我认为是磁盘上的物理文件)还是每次请求都动态呈现?
它是动态创建的,不是每次调用 IIRC,而是在第一次向元数据端点请求时创建。我不确定为什么您会在非 DEV 计算机上看到您的 DEV 服务器名称,但是,因为您仅在端点地址中指定 localhost,所以它将使用服务器的主网络地址来解析 DNS。您可能需要考虑将该useRequestHeadersForMetadataAddress行为添加到您的配置中,以便实际使用访问服务所使用的 DNS。