WCF-“;不完整”;WSDL引用另一个WSDL


WCF - "Incomplete" WSDL with reference to another WSDL

我正在使用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)