我们有一个现有的ASMX Web服务(.NET 2.0),现在我正在使用WCF和.NET 4.0创建一个新服务。
ASMX服务已通过SoapHeader
实现了自定义身份验证,看起来像这样,其中SecurityContextExtension
处理身份验证:
[WebService(Namespace = "http://tempuri.org/")]
public class ExistingWebService : WebService
{
public CustomContextHeader CustomContextHeader{ get; set; }
[WebMethod, SoapHeader("CustomContextHeader")]
[SecurityContextExtension]
public string GetExisting(int customerId)
{
// do stuff
return a string value;
}
}
新服务需要在现有的ASMX服务上调用此方法,因此我将其作为服务引用添加到我的项目中。
CustomContextHeader
作为方法的参数公开(我想通过WCF服务参考的魔力!)所以我从我的WCF服务调用ASMX看起来像这样:
[ServiceContract]
public interface INewService
{
[OperationContract]
string GetNew(int myId);
}
public class NewService : INewService
{
public string GetNew(int myId)
{
// do stuff
using (var client = new ExistingWebServiceSoapClient())
{
var new = client.GetExisting(CustomContextHeader, myId);
}
// do more stuff
}
}
正在访问新WCF服务的客户端也访问现有的ASMX,因此已经能够生成正确的CustomContextHeader并传递给GetExisting
方法。
因此,如果客户端要生成与ASMX相同的CustomContextHeader,如何更改我的WCF服务以接受并提取它以通过参数传递给ASMX?
我使用Google搜索并在Message Contracts和WCFExtras上发现了大量信息,但无法弄清楚如何实现这两种方法来实现我的需求。我宁愿不添加像WCFExtras这样的另一个依赖项,因此任何可以使用开箱即用的.NET 4.0功能的解决方案都将非常感激!