首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在用于wcf的php soap客户端中传递单个标记头?

如何在用于wcf的php soap客户端中传递单个标记头?
EN

Stack Overflow用户
提问于 2015-08-25 18:35:41
回答 1查看 386关注 0票数 0

我正在尝试从PHP使用WCF服务。我需要在PHP的soap客户端中传递一个头字段才能使用它。Soap标头将如下所示:

代码语言:javascript
复制
<header>
<LisenseKey>Lisense key goes here</LisenseKey>
</header>

LisenseKey元素的名称空间是"http://mylinsensekeynamespace“。

我想在WCF中使用的方法如下:

代码语言:javascript
复制
public string function GetMessage(string name)
{
    return "Hello , "+name;
}

在服务配置为验证头之前,我使用PHP中的服务,如下所示,它工作得很好:

代码语言:javascript
复制
try{
    $client = new SoapClient("http://localhost:8181/?wsdl");
    $param = new stdClass();
    $param->name = "My Name";
    $webService = $client->GetMessage($param);
    print_r($webService);
}
catch(Exception $e)
{
    echo $e->getMessage();  
}

当服务配置为验证头部中的许可证密钥后,我尝试像这样使用它,但它还不起作用:

代码语言:javascript
复制
try{
    $client = new SoapClient("http://localhost:8181/?wsdl");

    $actionHeader = new SoapHeader("http://mycustomheader",'LisenseKey',"lisense key",true);
    $client->__setSoapHeaders($actionHeader);
    $param = new stdClass();
    $param->name = "My Name";
    $webService = $client->GetMessage($param);
    print_r($webService);
}
catch(Exception $e)
{
    echo $e->getMessage();  
}

我已经尝试了很多不同的在线文章的方式。我怎么消费它?WCF服务正在使用BasicHttpBinding,并且SOAP版本应为1.1。如何传递header信息来消费服务?

下面是为每个请求验证LicenseKey soap头的.NET WCF服务代码。

代码语言:javascript
复制
    public class MyServiceMessageInspector : System.ServiceModel.Dispatcher.IDispatchMessageInspector
    {
        public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel,
            System.ServiceModel.InstanceContext instanceContext)
        {
            if (request.Headers.FindHeader("LisenseKey", "") == -1)
            {
                throw new FaultException("Lisense Key Was Not Provided");
            }

            var lisenseKey = request.Headers.GetHeader<string>("LisenseKey", "http://mycustomheader.com");
            if (string.IsNullOrEmpty(lisenseKey))
            {
                throw new FaultException("Lisnse key should not be empty");
            }

            if (lisenseKey != "12345x")
            {
                throw new FaultException("Lisense key is not valid");
            }

            return instanceContext;
        }

        public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {

        }
    }

    public class MyServiceMessageInspectorBehaviour : Attribute, System.ServiceModel.Description.IServiceBehavior
    {
        public void AddBindingParameters(System.ServiceModel.Description.ServiceDescription serviceDescription,
            System.ServiceModel.ServiceHostBase serviceHostBase,
            System.Collections.ObjectModel.Collection<System.ServiceModel.Description.ServiceEndpoint> endpoints,
            System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {

        }

        public void ApplyDispatchBehavior(System.ServiceModel.Description.ServiceDescription serviceDescription,
            System.ServiceModel.ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
            {
                foreach (var endpointDispatcher in channelDispatcher.Endpoints)
                {
                    endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyServiceMessageInspector());
                }
            }
        }

        public void Validate(System.ServiceModel.Description.ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
        {

        }
    }
EN

回答 1

Stack Overflow用户

发布于 2015-08-25 19:03:19

尝试像这样调用WCF服务:$client->__soapCall("GetMessage", $param, NULL, $header);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32201726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档