首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web Service >

WCF调用JAVA webservice 采用usernametoken header有关问题

2013-01-28 
WCF调用JAVA webservice 采用usernametoken header问题现在建了一个WCF服务,对方采用usernametoken验证没

WCF调用JAVA webservice 采用usernametoken header问题
现在建了一个WCF服务,对方采用usernametoken验证没有加密,调用时候总是提示
"An error was discovered processing the <wsse:Security> header”
我在客户端也加入了
client.ClientCredentials.UserName.UserName = "admin";
client.ClientCredentials.UserName.Password = "123456";
求解!!!!!急!!!!!! wcf webservice
[解决办法]
应该通过 SoapHeader。
[解决办法]
这个问题比较复杂。我给你解决吧!需要你对WebService理解稍微深入一点,这是因为Java采用usernametoken验证,C#调用的时候并不会在SoapHeader里包含身份信息,需要自己实现
之前也是遇到这个问题,网上很多讲怎么解决这个问题,实际上没有一个能解决的!我给你直接上代码


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ServiceModel.Description;
using System.ServiceModel;
using System.ServiceModel.Security;
using System.Text;
using System.Security.Cryptography;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.Xml;
using System.ServiceModel.Configuration;
using System.Xml.Serialization;
using System.IO;
using System.Runtime.Serialization;

namespace JavaWebServiceCaller
{

    public class CustomClientMessageInspector : IDispatchMessageInspector, IClientMessageInspector
    {
        public string UserName { get; private set; }
        public string Password { get; private set; }

        public CustomClientMessageInspector()
        {

        }
        public CustomClientMessageInspector(string userName, string password)
        {
            UserName = userName;
            Password = password;
        }
        #region Message Inspector of the Service

        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {

            return null;
        }

        public void BeforeSendReply(ref Message reply, object correlationState)
        {
        }

        #endregion

        #region Message Inspector of the Consumer

        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)


        {
            MessageHeader header = new CustomMessageHeader(UserName, Password);

            request.Headers.Add(header);
            return null;
        }

        #endregion
    }
    class CustomMessageHeader : MessageHeader
    {
        private const string PREFIX_SEC = "wsse";
        private const string PREFIX_SOAP = "soapenv";

        private const string NAMESPACE_SEC = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";

        private const string NAMESPACE_SOAP = "http://schemas.xmlsoap.org/soap/envelope/";

        public string UserName { get; private set; }
        public string Password { get; private set; }

        public CustomMessageHeader(string userName, string password)
        {
            UserName = userName;
            Password = password;
        }
        protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
        {
            base.OnWriteStartHeader(writer, messageVersion);
        }
        protected override void OnWriteStartHeader(System.Xml.XmlDictionaryWriter writer, MessageVersion messageVersion)
        {
            writer.WriteStartElement(PREFIX_SOAP, "Header", NAMESPACE_SOAP);

            //Security
            writer.WriteStartElement(PREFIX_SEC, "Security", NAMESPACE_SEC);
            writer.WriteAttributeString(PREFIX_SOAP, "mustUnderstand", NAMESPACE_SOAP, "1");
            writer.WriteXmlnsAttribute(PREFIX_SEC, NAMESPACE_SEC);
            writer.WriteXmlnsAttribute(PREFIX_SOAP, NAMESPACE_SOAP);

            //UsernameToken
            writer.WriteStartElement(PREFIX_SEC, "UsernameToken", NAMESPACE_SEC);

            //Username
            writer.WriteElementString(PREFIX_SEC, "Username", NAMESPACE_SEC, UserName);



            //Password
            writer.WriteStartElement(PREFIX_SEC, "Password", NAMESPACE_SEC);
            writer.WriteAttributeString("Type", @"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
            writer.WriteValue(Password);
            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.WriteEndElement();
        }


        public override string Name
        {
            get { return "Security"; }
        }

        public override string Namespace
        {
            get { return NAMESPACE_SEC; }
        }
    }


    public class CustomBehavior : Attribute, IEndpointBehavior
    {
        #region IEndpointBehavior Members

        public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
        {
            var clientCredentials = endpoint.Behaviors.Find<ClientCredentials>();
            if (clientCredentials != null)
            {
                var inspector = new CustomClientMessageInspector(clientCredentials.UserName.UserName, clientCredentials.UserName.Password);
                clientRuntime.MessageInspectors.Add(inspector);
            }
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
        {
            //ChannelDispatcher channelDispatcher = endpointDispatcher.ChannelDispatcher;
            //if (channelDispatcher != null)


            //{
            //    foreach (EndpointDispatcher ed in channelDispatcher.Endpoints)
            //    {
            //        var inspector = new CustomClientMessageInspector();
            //        ed.DispatchRuntime.MessageInspectors.Add(inspector);
            //    }
            //}
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }

        #endregion
    }

    public class CustomBehaviorExtensionElement : BehaviorExtensionElement
    {
        protected override object CreateBehavior()
        {
            return new CustomBehavior();
        }

        public override Type BehaviorType
        {
            get
            {
                return typeof(CustomBehavior);
            }
        }
    }


}


热点排行