Вопрос
У меня есть внутреннее корпоративное приложение, которое в настоящее время использует 10 различных веб-сервисов.Они используются через «Веб-ссылки» старого стиля вместо использования WCF.
Проблема, с которой я столкнулся, заключается в том, что я пытаюсь работать с другими командами компании, которые создают сервисы, которыми я пользуюсь.Я обнаружил, что мне нужно точно фиксировать сообщения SOAP, которые я отправляю и получаю.Я сделал это, создав новый атрибут, расширяющий SoapExtensionAttribute.Затем я просто добавляю этот атрибут к методу службы в созданном файле Reference.cs.Это работает, но болезненно по двум причинам.Во-первых, это сгенерированный файл, поэтому все, что я в нем делаю, можно перезаписать.Во-вторых, я должен не забыть удалить атрибут перед возвратом файла.
Есть ли лучший способ зафиксировать точные сообщения SOAP, которые я отправляю и получаю?
Решение
Кажется, это распространенный вопрос, поскольку я только что задал его, и мне сказали посмотреть здесь.
Вам не нужно редактировать созданный Reference.cs
.Вы можете ссылаться на расширение в своем приложении. app.config
.
Другие советы
Это веб-приложение?
Поместите код SoapExtension в HTTPModule и внедрите конверт SOAP в поток HTTPOutput.
Таким образом, в режиме отладки я представляю что-то вроде складного элемента div в верхней части страницы, в котором перечислены все соединения SOAP для этой страницы.
У меня уже есть встроенный HTTPModule, который делает это, я выделю специфическую информацию о своей компании и опубликую ее позже сегодня.
Также обратите внимание на SoapUI, это удобный инструмент.
Вы можете сделать это, создав SoapExtention.Проверять Эта статья.
Я использовал следующий код — это пример того, как я фиксировал запросы SOAP в приложении, написанном некоторое время назад.
<System.Diagnostics.Conditional("DEBUG")> _
Private Sub CheckHTTPRequest(ByVal functionName As String)
Dim e As New UTF8Encoding()
Dim bytes As Long = Me.Context.Request.InputStream.Length
Dim stream(bytes) As Byte
Me.Context.Request.InputStream.Seek(0, IO.SeekOrigin.Begin)
Me.Context.Request.InputStream.Read(stream, 0, CInt(bytes))
Dim thishttpRequest As String = e.GetString(stream)
My.Computer.FileSystem.WriteAllText("D:\SoapRequests\" & functionName & ".xml", thishttpRequest, False)
End Sub
Установка условного атрибута, как я, заставляет компилятор игнорировать вызов метода для всех типов сборки, кроме отладки.
Извините за VB, мне его навязали.