我有意冒充衆所周知的Web服務和WCF服務進行集成測試。爲此,我想捕獲服務元數據,自動生成服務存根,並在自託管環境中託管服務存根。將ASMX Web服務元數據導入到WCF端點
以下this article here,我能夠獲得遠程Wcf服務元數據並生成合同。但是,對於遠程的Asmx Web服務,我也遇到了一些困難。
我有一套用於審覈的mickey-mouse解決方案。
我ASMX解決方案包含一個默認的 「Hello World」 Web服務,發現下面
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SimpleAsmxService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld() { return "Hello World"; }
}
我的WCF解決方案包含一個默認的 「Hello World」 的服務,還發現以下
[ServiceContract]
public interface ISimpleWcfService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[DataContract]
public class CompositeType
{
[DataMember]
public bool BoolValue { get; set; }
[DataMember]
public string StringValue { get; set; }
}
public class SimpleWcfService : ISimpleWcfService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
最後,小控制檯,可能看起來像
class Program
{
public const string UrlWcf =
"http://localhost:8731/Design_Time_Addresses/SimpleWcfService/mex";
public const string UrlAsmx =
"http://localhost:1803/SimpleAsmxService.asmx?WSDL";
static void Main(string[] args)
{
EndpointAddress mexAddress = new EndpointAddress (UrlWcf);
MetadataExchangeClient mexClient =
new MetadataExchangeClient (mexAddress);
mexClient.ResolveMetadataReferences = true;
// NOTE: blows up if we use UrlAsmx
MetadataSet metaSet = mexClient.GetMetadata();
WsdlImporter importer = new WsdlImporter (metaSet);
Collection<ContractDescription> contracts =
importer.ImportAllContracts();
}
}
在我看來,我應該能夠從知名的Asmx Web服務中拉取Wsdl並生成合同[以及從合同到代碼],但似乎無法扭轉前面的示例。任何幫助將不勝感激,
謝謝!
注:以上調用MetadataSet metaSet = mexClient.GetMetadata();
時所產生的誤差是
元數據的消息的
System.InvalidOperationException
包含無法解析的引用: 'http://localhost:1803/SimpleAsmxService.asmx?WSDL'
隨着System.InvalidOperationException
內部例外消息
<?xml version="1.0" encoding="utf-16"?>
<Fault xmlns="http://www.w3.org/2003/05/soap-envelope">
<Code>
<Value>Sender</Value>
</Code>
<Reason>
<Text xml:lang="en">
System.Web.Services.Protocols.SoapException: Unable to handle request without a valid action parameter. Please supply a valid soap action.
at System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
</Text>
</Reason>
</Fault>
@johnny - 不客氣。 ... 好傢伙!我的第一個賞金! – Filburt 2010-02-22 22:12:55