将通过WCF服务的SoapHeader传递给ASMX服务
问题描述:
我们有一个现有的ASMX Web服务(.NET 2.0),现在我正在使用WCF和.NET 4.0创建一个新服务。将通过WCF服务的SoapHeader传递给ASMX服务
的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?
我已经谷歌搜索,并发现了很多关于Message Contracts和WCFExtras的信息,但不能完全弄清楚如何实现任何方法来实现我所需要的。我不希望添加像WCFExtras这样的其他依赖项,因此任何可以使用即装即用的.NET 4.0功能的解决方案都将不胜感激!
@Shevak我正面临一个相关的问题。你可以帮助我,因此,写在这里。你能分享我,什么作为“CustomContextHeader”从wcf客户端传递,因为这个额外的argumnet显示为标题。我们是否必须创建名为“CustomContextHeader”的对象名称并在其中保留tokenID或相关属性并将其对象作为argumnet传递?请给我建议。我不清楚在ASMX调用中应该如何通过头部参数,没有这样的argumnet,我们只设置了TOKENID字段,并且方法现在只有一个argumnet“ID”,它显示了两个argumnet - HEADER,ID和OUT PARAMETER respoonse。 – dsi