У меня есть службы 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», ?
Еще раз спасибо!
Re fer this this http://stackoverflow.com/questions/14621544/how-can-i-add-authorization-header-to-the-request-in-wcf?rq=1 – MahaSwetha
Спасибо MahaSwetha, но это не имеет особого отношения к моя проблема, поскольку речь идет о приложении, которое может потреблять WCF напрямую, что не может, потому что это приложение .NET 2. – Ceottaki