gpt4 book ai didi

wcf - 将 ASMX Web 服务元数据导入到 WCF 端点

转载 作者:行者123 更新时间:2023-12-02 09:24:02 27 4
gpt4 key购买 nike

我有兴趣模拟众所周知的 Web 服务和 Wcf 服务以进行集成测试。为此,我想在自托管环境中捕获服务元数据、自动生成服务 stub 和托管服务 stub 。

已关注 this article here ,我能够获取远程 Wcf 服务元数据并生成契约(Contract)。但是,我在对远程 Asmx Web 服务执行相同操作时遇到一些困难。

我有一套米老鼠解决方案来审查这个问题。

我的 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,消息为

Metadata contains a reference that cannot be resolved : '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&amp; abortProcessing)
</Text>
</Reason>
</Fault>

最佳答案

让它与 ASMX Web 服务一起使用的方法是指定 MetadataExchangeClientMode

...
MetadataExchangeClient mexClient =
new MetadataExchangeClient (new Uri(), MetadataExchangeClientMode.HttpGet);
...

为您的 ASMX 服务使用 MetadataExchangeClientMode.HttpGetMetadataExchangeClientModeMetadataExchange 用于您的 WCF 服务。

关于wcf - 将 ASMX Web 服务元数据导入到 WCF 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2112257/

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