C# 将ASMX合同转换为WCF

C# 将ASMX合同转换为WCF,c#,asp.net,.net,web-services,wcf,C#,Asp.net,.net,Web Services,Wcf,我有一个旧的Web服务,我需要转换成一个新的系统,它不在IIS中托管,所以我不能直接复制它。我可以创建自托管的WCF服务,这样就可以将功能放在那里。 但是,我无法使合同匹配,因为我们已有的客户端在连接到Web服务时出现以下异常: 由于EndpointDispatcher上的ContractFilter不匹配,无法在接收器上处理具有操作“”的消息 我在其他一些帖子中读到,我可以通过在命令提示符下运行以下命令来确保合同是相同的: wsdl.exe /serverInterface http://ol

我有一个旧的Web服务,我需要转换成一个新的系统,它不在IIS中托管,所以我不能直接复制它。我可以创建自托管的WCF服务,这样就可以将功能放在那里。 但是,我无法使合同匹配,因为我们已有的客户端在连接到Web服务时出现以下异常:

由于EndpointDispatcher上的ContractFilter不匹配,无法在接收器上处理具有操作“”的消息

我在其他一些帖子中读到,我可以通过在命令提示符下运行以下命令来确保合同是相同的:

wsdl.exe /serverInterface http://oldservices.mysite.com/MyService.asmx?WSDL
该命令生成一些代码,“为服务器实现生成接口”

我将这段代码带到我的新解决方案中并启动了它(在添加了一些额外的属性并美化了代码之后),我可以从中成功调用MyMethod并获得预期的结果。然而,老客户仍然抱怨,只有一个例外

要成功地将旧的ASMX Web服务转换为完全兼容的WCF服务,我必须做些什么

我的调整界面 我的调整类型定义 实现类 WCF起动器
我终于在另一个论坛上得到了一个正确的方向的推动,这为我指明了方向。 我之前关于
wsdl.exe
的发现被证明是不正确的。相反,您必须运行以下命令:

SvcUtil.exe /serviceContract http://oldservices.mysite.com/MyService.asmx?WSDL
这将生成一个可以调整和美化的文件(只需不更改任何类名)

然后像我上面所做的那样启动WCF服务,增加一行:

smb.ExternalMetadataLocation = new Uri("http://localhost:8080/wsdl/MyService.wsdl");

这里引用的WSDL文件必须与旧服务生成的WSDL相同。只需将自动生成的WSDL文件保存到新服务器,并记住更改文件底部的地址位置,以指向新服务(而不是旧服务),您就可以开始了

您的问题和回答都有
locahost
打字错误谢谢。更新帖子。
public class MyServiceSoap : IMyServiceSoap {
    public ReturnMessage MyMethod() {
        return new ReturnMessage() { Status = ReturnStatus.OK, GenericReturn = new Foo() };
    }
}
ServiceHost host = new ServiceHost(typeof(MyServiceSoap), new Uri("http://localhost:8080/MyService.asmx"));
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy12;
host.Description.Behaviors.Add(smb);
host.Open();
SvcUtil.exe /serviceContract http://oldservices.mysite.com/MyService.asmx?WSDL
smb.ExternalMetadataLocation = new Uri("http://localhost:8080/wsdl/MyService.wsdl");