2011-02-04 2 views
11

Я должен использовать услугу, предоставляемую одним из наших партнеров. Мне дали небольшое направление, но мне сказали, что безопасность должна быть PasswordDigest. Я посмотрел на него и сразу увидел множество ссылок на ВФБ, поэтому я пошел. Это было очень легко реализовать, и я мгновенно имел стандартный токен пользователя WSE, используя PasswordDigest, сидящий в заголовках SOAP моих сообщений.Добавление заголовков http в вызове службе SoapHttpClient

Когда мы начали тестировать сегодня, я сразу же сообщил (сообщением об ошибке), что все было не так. Оказывается, партнер не смотрит в заголовок SOAP, а хочет получить информацию о безопасности в заголовке http.

Я видел много статей о том, как добавить пользовательские заголовки HTTP в класс прокси, но мой прокси наследует от SoapHttpClientProtocol, у которого нет коллекции заголовков для добавления. Я смотрел на создание raw httpWebRequest, но у меня есть специальный метод доступа, который имеет некоторые сложные параметры, с которыми можно иметь дело (и, кроме того, он чувствует себя подобно возврату).

Каков наилучший способ добавления пользовательских заголовков HTTP в класс прокси-сервера службы, который не имеет метода GetWebRequest?

Для справки:

Proxy класс decleration:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Web.Services.WebServiceBindingAttribute(Name="MtomServiceSoap11", namespace="http://ws.xxxxxxx.com/")] 
public partial class MtomServiceService : System.Web.Services.Protocols.SoapHttpClientProtocol { 

целевой метод нужно вызвать:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)] 
[return: System.Xml.Serialization.XmlElementAttribute("uploadDocumentResponse", Namespace="http://ws.edsmtom.citizensfla.com/")] 
public uploadDocumentResponse uploadDocument([System.Xml.Serialization.XmlElementAttribute(Namespace="http://ws.xxxxxxx.com/")] uploadDocumentRequest uploadDocumentRequest) { 
    object[] results = this.Invoke("uploadDocument", new object[] { 
     uploadDocumentRequest}); 
     return ((uploadDocumentResponse)(results[0])); 
    } 
} 

Фактический вызов службы просто , Объекты, перевозимые в данный момент:

request.criteria = docCriteria; 
request.document = document; 
var result = service.uploadDocument(request); 

Спасибо.

ответ

23

Он показывает, что через 30 минут после публикации я наткнулся на ответ. Хотя деблокировка класса proxy не создает метод GetWebRequest, его базовый класс System.Web.Services.Protocols.SoapHttpClientProtocol имеет его, и его можно переопределить.

protected override System.Net.WebRequest GetWebRequest(Uri uri) 
{ 
    var request = base.GetWebRequest(uri); 
    request.Headers.Add("blah", "blah"); // <---- 
    return request; 
} 
+1

, пожалуйста, не стесняйтесь отметить свой собственный ответ – Snowbear