WCF WSDL SOAP消息头的所有操作 [英] WCF WSDL Soap Header on all operations

查看:502
本文介绍了WCF WSDL SOAP消息头的所有操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通过定义一个实现IContactBehavior和IWsdlExportExtension和设置您的服务合同上属性的属性,你可以轻松地添加 SOAP头到您的WSDL (见的 HTTP://wcfextras.$c$cplex.com/ 获得更多信息)

By defining an attribute that implements IContactBehavior and IWsdlExportExtension and set that attribute on your service contract, you can easily add Soap Headers to your wsdl (see http://wcfextras.codeplex.com/ for more information)

但现在我需要设置在所有Operationcontracts的WSDL SOAP头合约,这次我不能设置一个属性。

But now I need to set a Soap Header contract in the wsdl on all Operationcontracts and this time I cannot set an attribute.

继code(从IWsdlExportExtension.ExportEndPoint调用)不起作用,但是从SoapHeaderAttributes(即执行一个IWsdlExportExtension.ExportContract)

Following code (called from IWsdlExportExtension.ExportEndPoint) doesn't work, but does work when called from the SoapHeaderAttributes (that executes an IWsdlExportExtension.ExportContract)

foreach (OperationDescription operationDescription in context.ContractConversionContext.Contract.Operations)
{
   AddSoapHeader(operationDescription, "SomeHeaderObject", typeof(SomeHeaderObject), SoapHeaderDirection.InOut);                    
}

internal static void AddSoapHeader(OperationDescription operationDescription, string name, Type type, SoapHeaderDirection direction)
{
	MessageHeaderDescription header = GetMessageHeader(name, type);
	bool input = ((direction & SoapHeaderDirection.In) == SoapHeaderDirection.In);
	bool output = ((direction & SoapHeaderDirection.Out) == SoapHeaderDirection.Out);

	foreach (MessageDescription msgDescription in operationDescription.Messages)
	{
		if ((msgDescription.Direction == MessageDirection.Input && input) ||
			(msgDescription.Direction == MessageDirection.Output && output))
			msgDescription.Headers.Add(header);
	}
}

internal static MessageHeaderDescription GetMessageHeader(string name, Type type)
{
	string headerNamespace = SoapHeaderHelper.GetNamespace(type);
	MessageHeaderDescription messageHeaderDescription = new MessageHeaderDescription(name, headerNamespace);
	messageHeaderDescription.Type = type;
	return messageHeaderDescription;
}

任何人有一个想法如何应用此code上的所有操作(不使用属性),并通过这样做,加上头的合同的WSDL?

Anyone has an idea how to apply this code on all operations (without using attributes) and by doing this, adding the contract of the header to the wsdl ?

推荐答案

该IEndpointBehavior具有以下接口:

The IEndpointBehavior has the following interface:

ApplyDispatchBehavior(ServiceEndpoint endPoint, EndPointDispatcher endpointDispatcher);

您可以通过遍历在ApplyDispatchBehavior的endpoint.Contract.Operations SOAP头添加到WSDL中的操作。

You can add Soap Headers to the wsdl for operations by iterating over the endpoint.Contract.Operations in the ApplyDispatchBehavior.

在这里,你必须为我工作的完整解决方案:

Here you have the complete solution that worked for me:

void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
    foreach (OperationDescription operationDescription in endpoint.Contract.Operations)
    {
        foreach (MessageDescription msgDescription in operationDescription.Messages)
        {
            AddSoapHeader(operationDescription, "SomeHeaderObject", typeof(SomeHeaderObject), SoapHeaderDirection.InOut);
        }
    }
}

internal static void AddSoapHeader(OperationDescription operationDescription, string name, Type type, SoapHeaderDirection direction)
{
    MessageHeaderDescription header = GetMessageHeader(name, type);
    bool input = ((direction & SoapHeaderDirection.In) == SoapHeaderDirection.In);
    bool output = ((direction & SoapHeaderDirection.Out) == SoapHeaderDirection.Out);

    foreach (MessageDescription msgDescription in operationDescription.Messages)
    {
            if ((msgDescription.Direction == MessageDirection.Input && input) ||
                    (msgDescription.Direction == MessageDirection.Output && output))
                    msgDescription.Headers.Add(header);
    }
}

internal static MessageHeaderDescription GetMessageHeader(string name, Type type)
{
    string headerNamespace = SoapHeaderHelper.GetNamespace(type);
    MessageHeaderDescription messageHeaderDescription = new MessageHeaderDescription(name, headerNamespace);
    messageHeaderDescription.Type = type;
    return messageHeaderDescription;
}

该SoapHeaderHelper可以在 WcfExtras

这篇关于WCF WSDL SOAP消息头的所有操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆