我正在使用SoapClient将一些数据从PHP站点发送到.Net WCF服务
这是我的(为了清晰起见,缩写)代码:
$wsdl = '/var/www/libraries/MyWsdl.xml';
$myClient = new SoapClient($wsdl);
然后,实际调用:
try {
$res = $myClient->Foo($someParameter);
}
catch(SoapFault $e){
//...
}
catch(Exception $e){
//...
}
当所有内容都处于联机状态时,这非常有效,如果目标服务器在调用Foo
时出现故障,则错误处理也会起作用
问题是,如果目标服务器关闭,SoapClient
构造函数会失败,尽管我为它提供了一个带有WSDL的静态XML文件(与"http://www.destination.com/MyService?wsdl
"这样的URL相反)。
我相信这是因为WSDL包含对另一个WSDL的引用:
<wsdl:import namespace="http://MyCompany.Services" location="http://www.destination.com/MyService?wsdl=wsdl0"/>
另一个WSDL包含调用参数的定义。
那么,我如何在原始WSDL中"内联"第二个"子WSDL"呢
这是否允许我在不启动与目标服务器的连接的情况下创建SoapClient
这是我的服务定义:
[ServiceContract(Namespace = "http://MyCompany.Services")]
public interface IMyService
{
[OperationContract]
[XmlSerializerFormat(Style = OperationFormatStyle.Rpc, Use = OperationFormatUse.Literal)]
string Foo(string myParameter);
}
您可以从这里使用单个WSDL文件扩展名:http://wcfextras.codeplex.com/
请注意,当使用.net4.5时,应该不需要它,因为默认的元数据端点现在除了链接的版本之外,还生成单个WSDL文件。要做到这一点,只需在URI中添加"?singleWSDL"(来源:http://msdn.microsoft.com/en-us/library/dd456789(v=vs.110).aspx)