[英]Converting ASMX contracts to WCF
我有一个较旧的Web服务,需要转换为不在IIS中托管的新系统,因此无法直接复制它。 我可以创建自托管的WCF服务,因此可以将功能放在那里。 但是,由于我们已经拥有的客户端在连接到Web服务时给出以下异常,因此我无法使合同匹配:
由于EndpointDispatcher的ContractFilter不匹配,因此无法在接收方处理带有操作“ http://services.mysite.com/MyService/MyMethod ”的消息。
我读过其他一些SO帖子,我可以通过在命令提示符中运行以下命令来确保合同相同:
wsdl.exe /serverInterface http://oldservices.mysite.com/MyService.asmx?WSDL
该命令生成一些代码, 根据文档 “为服务器实现生成接口”。
我将此代码带入我的新解决方案中,并使其开始运行(在添加了一些额外的属性并修饰了代码之后),我可以从WebService Studio成功调用MyMethod并获得预期的结果。 但是,老客户仍然抱怨相同的例外。
要成功将旧的ASMX Web服务成功转换为完全兼容的WCF服务,我该怎么做?
[WebServiceBinding(Name = "MyServiceSoap", Namespace = "http://services.mysite.com/MyService")]
[XmlInclude(typeof(Foo))]
[XmlInclude(typeof(Bar))]
[ServiceContract]
[ServiceKnownType(typeof(Foo))]
[ServiceKnownType(typeof(Bar))]
public interface IMyServiceSoap {
[OperationContract, XmlSerializerFormat(Style = OperationFormatStyle.Document)]
[WebMethod]
[SoapDocumentMethod("http://services.mysite.com/MyService/MyMethod", RequestNamespace = "http://services.mysite.com/MyService", ResponseNamespace = "http://services.mysite.com/MyService", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
ReturnMessage MyMethod();
}
[Serializable]
[XmlType(Namespace = "http://services.mysite.com/MyService")]
public class ReturnMessage {
public ReturnStatus Status { get; set; }
public object GenericReturn { get; set; }
}
[Serializable]
[XmlType(Namespace = "http://services.mysite.com/MyService")]
public enum ReturnStatus {
}
[Serializable]
[XmlType(Namespace = "http://services.mysite.com/MyService")]
public class Foo {
public string Text { get; set; }
}
[Serializable]
[XmlType(Namespace = "http://services.mysite.com/MyService")]
public class Bar {
public int Number{ get; set; }
}
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();
我终于在另一个论坛上朝着正确的方向努力,这使我指向了此页面 。 我以前对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文件保存到新服务器,并记得更改文件底部的地址位置以指向您的新服务(而不是旧服务),就可以开始使用了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.