2013-04-29 5 views
1

У меня есть службы WCF, которая использует пользовательский поставщик экземпляра (реализует IInstanceProvider), для которого метод GetInstance ожидает сообщение, которое содержит несколько заголовков, например:Я использую службу WCF, которая требует заголовков с веб-сайта .NET 2. Как я могу программно добавлять заголовки к сообщениям?

public object GetInstance(InstanceContext instanceContext, Message message) 
    { 
     string token = null; 

     if (message != null) 
     { 
      token = message.Headers.GetHeader<string>("Token", "urn:userinfo"); 
     } 

     Bootstrapper bootstrapper = new Bootstrapper(); 
     bootstrapper.InitialiseSession(token); 

     return new MyServiceHost(bootstrapper.ServiceModel); 
    } 

теперь нуждается Эта услуга будет вызываться из .NET 2, поэтому я добавил конечную точку basicHttpBinding в службу WCF и успешно добавил веб-ссылку на это приложение .NET 2, которое добавило папку App_WebReferences с папкой MyService внутри, включая файл WSDL и несколько файлов .XSD.

Чтобы немного разъяснить, что веб-приложение написано в VB.Net вместо C#, и я не так хорошо знаком с VB.Net, как с C#.

Так, в коде веб-приложения я написал:

Private myService As MyService.MyServiceHost 
    myService.Url = "http://myserver:1234/MyService" 
    myService.MyMethod() 

Это все работает отлично, сервис получает сообщение для выполнения MyMethod, но, как и ожидалось, он возвращает сообщение об ошибке: «Существует не заголовок с именем Token и namespace urn: userinfo в сообщении. "

С моими клиентами (C#, .NET 4.5), все что я делаю в коде при создании клиента, который будет вызывать службу является:

MessageHeader<string> headerToken; 
    OperationContext.Current = new OperationContext((IContextChannel)serviceClient); 
    headerToken = new MessageHeader<string>("insert-token-here"); 
    OperationContext.Current.OutgoingMessageHeaders.Add(headerToken.GetUntypedHeader("Token", "urn:userinfo")); 

Как я могу сделать что-то подобное в .NET- заявление?

Спасибо!


UPDATE:

Теперь я сумел передать заголовок к службе, создав другой класс, который наследует класс MyService.MyServiceHost, а затем переопределение метода GetWriterForMessage, как это:

Protected Overrides Function GetWriterForMessage(ByVal message As System.Web.Services.Protocols.SoapClientMessage, ByVal bufferSize As Integer) As System.Xml.XmlWriter 
     Dim myWriterForMessage As System.Xml.XmlWriter 

     Dim myHeader As MySoapHeader 
     myHeader = New MySoapHeader() 
     myHeader.Token = "myToken" 

     message.Headers.Add(myHeader) 
     myWriterForMessage = MyBase.GetWriterForMessage(message, bufferSize) 

     Return myWriterForMessage 
    End Function 
End Class 

И я создал новый класс под названием MySoapHeader, который наследует System.Web.Services.Protocols.SoapHeader и имеет свойство Token.

Глядя на службу поддержки WCF, сообщение идет с заголовком, но, к сожалению, имя заголовка - это имя класса (MySoapHeader), а пространство имен заголовка - «http://tempuri.org», что неверно.

Как я могу изменить это, не назвав мой класс «Токен» (что очень нежелательно для имени класса, но это имя заголовка, ожидаемого моей службой), а пространство имен заголовка - «urn: userinfo», ?

Еще раз спасибо!

+0

Re fer this this http://stackoverflow.com/questions/14621544/how-can-i-add-authorization-header-to-the-request-in-wcf?rq=1 – MahaSwetha

+1

Спасибо MahaSwetha, но это не имеет особого отношения к моя проблема, поскольку речь идет о приложении, которое может потреблять WCF напрямую, что не может, потому что это приложение .NET 2. – Ceottaki

ответ

1

Хорошо, мне удалось разобраться с этим.

Я создал свой собственный класс обслуживания, как я уже говорил в обновлении, и создал свой собственный метод GetWriterForMessage, как это:

Partial Public Class MyExtendedServiceHost 
    Inherits MyService.MyServiceHost 

    Private _token As String 

    Public Sub New(ByVal token As String) 
     _token = token 
    End Sub 

    Protected Overrides Function GetWriterForMessage(ByVal message As System.Web.Services.Protocols.SoapClientMessage, ByVal bufferSize As Integer) As System.Xml.XmlWriter 
     Dim myWriterForMessage As System.Xml.XmlWriter 

     Dim myTokenHeader As TokenSoapHeader 
     myTokenHeader = New TokenSoapHeader() 
     myTokenHeader.Value = _token 

     message.Headers.Add(myTokenHeader) 
     myWriterForMessage = MyBase.GetWriterForMessage(message, bufferSize) 

     Return myWriterForMessage 
    End Function 
End Class 

Я также должен был создать класс для моих маркеров заголовка:

<XmlRoot(Namespace:="urn:userinfo", ElementName:="Token", DataType:="string", IsNullable:=False)> _ 
Public Class TokenSoapHeader 
    Inherits System.Web.Services.Protocols.SoapHeader 

    <XmlText()> _ 
    Public Value As String 
End Class 

Теперь я могу запустить этот код без каких-либо проблем, и заголовок передается вниз правильно:

Private myService As New MyExtendedServiceHost("my-token-here") 
myService.Url = "http://myserver:1234/MyService" 
myService.MyMethod() 
+0

Я использовал ваш подход, и пользовательские заголовки сообщений правильно передаются с сервера .Net 2.0 на сервер .Net 4.0. Когда я изменяю метод исходящих заголовков collection @ server, свойство message.Headers в методе GetReaderForMessage не имеет клиента заголовков. Я делаю что-то неправильно? –