Использование WinHttpRequest в Excel 2003 под XP

Я использую приведенный ниже код для выполнения запросов POST и GET к моему веб-сервису HTTP + JSON. Все отлично работает под Win7 и Excel 2013. При тестировании под Windows XP и Excel 2003 GET работал нормально (тело запроса содержит объект JSON), а POST - нет. Данные JSON, которые должны быть отправлены по линии, выглядят идеально, но не принимаются на стороне сервера, а клиентский код не сообщает об ошибке. К сожалению, я не могу установить снифферы, чтобы увидеть, что действительно отправляется. После изменения кода для использования объекта MSXML2.ServerXMLHTTP он работает нормально (так что это будет решением). Есть ли у кого-нибудь опыт решения этой проблемы? Я пытаюсь понять, почему это не работает с WinHttpRequest...

'Copied from https://coderwall.com/p/pbxsyw/vba-web-requests
Private Function MakeWebRequest(Method As String, Url As String, PostData As String) As Boolean
    ' make sure to include the Microsoft WinHTTP Services in the project
    ' tools -> references -> Microsoft WinHTTP Services, version 5.1
    ' http://www.808.dk/?code-simplewinhttprequest
    ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa384106(v=vs.85).aspx
    ' http://www.neilstuff.com/winhttp/

    On Error GoTo ErrorHandler:

    ' create the request object
    Set mobjWebReq = CreateObject("WinHttp.WinHttpRequest.5.1")

    ' set timeouts
    ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa384061(v=vs.85).aspx
    ' SetTimeouts(resolveTimeout, ConnectTimeout, SendTimeout, ReceiveTimeout)
    mobjWebReq.SetTimeouts 60000, 60000, 60000, 60000

    If Not LastUsedUrlMonitor Is Nothing Then
        LastUsedUrlMonitor.Value2 = Url
    End If

    ' make the request, http verb (method), url, false to force syncronous
    ' open(http method, absolute uri to request, async (true: async, false: sync)
    mobjWebReq.Open Method, Url, False

    ' handle post content type
    If Method = "POST" Then
        mobjWebReq.SetRequestHeader "Content-type", _
          "application/json"
        If Not LastHttpBodySendMonitor Is Nothing Then
            LastHttpBodySendMonitor.Value2 = PostData
        End If
    End If

    ' set WinHttpRequestOption enumerations
    ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa384108(v=vs.85).aspx

    ' set ssl ignore errors
    '   13056: ignore errors
    '   0: break on errors
    mobjWebReq.Option(4) = 13056

    ' set redirects
    mobjWebReq.Option(6) = True

    ' allow http to redirect to https
    mobjWebReq.Option(12) = True

    ' send request
    ' send post data, should be blank for a get request
    mobjWebReq.Send PostData

    MakeWebRequest = True

    If Not LastHttpBodyReceivedMonitor Is Nothing Then
        LastHttpBodyReceivedMonitor.Value2 = mobjWebReq.Status & ": " & mobjWebReq.StatusText & ", Body: " & mobjWebReq.ResponseText
    End If

    Exit Function

ErrorHandler:
    Select Case Err.Number
        Case &H80072EFD
            MsgBox "Connection to URL: " & Chr(13) & Url & Chr(13) & "failed: " & Err.Description
        Case Else
            MsgBox Err.Number & Chr(13) & Err.Description
    End Select
    Err.Clear
    'Set mobjWebReq = Nothing
    MakeWebRequest = False
    Exit Function
End Function

person RuudSieb    schedule 03.10.2016    source источник
comment
но он не получен на стороне сервера, что означает? В журнале доступа к серверу даже нет записи для POST-запроса? Но если он есть, пожалуйста, посмотрите и покажите, что он говорит. Если на запрос POST ответили с ошибкой (например, 500), посмотрите также журнал ошибок сервера.   -  person Axel Richter    schedule 03.10.2016
comment
@axel-richter, сервер представляет собой службу .NET WCF HTTP/JSON, которая регистрирует входящие запросы, используя поведение конечной точки. Входящий POST-запрос регистрируется, но в теле, похоже, нет данных. Что приводит к плохому запросу.   -  person RuudSieb    schedule 03.10.2016
comment
К счастью (к сожалению для вас, но никто не должен работать даже с XP в 2016 году) у меня нет запущенной XP для тестирования. Но для получения помощи было бы неплохо, если бы вы показали всю информацию журнала для входящего POST. кажется, что в теле нет данных, это несколько загадочно.   -  person Axel Richter    schedule 03.10.2016
comment
@ Аксель-Рихтер, ты прав. Насколько я могу судить, в теле запроса нет данных. Я написал «кажется», потому что ведение журнала выполняется в поведении конечной точки, и может случиться так, что тело отбрасывается на каком-то более низком уровне связи. К сожалению, у меня нет ведения журнала диагностики WCF.   -  person RuudSieb    schedule 03.10.2016
comment
Может быть, вы могли бы попробовать без mobjWebReq.SetTimeouts.... См. msdn.microsoft. .com/en-us/library/windows/desktop/   -  person Axel Richter    schedule 04.10.2016


Ответы (1)


Спасибо за ответы Аксель. Я только что решил проблему (после того, как выдернул волосы). По-видимому, это работает, как и ожидалось, в Excel 2003:

mobjWebReq.Send (PostData)

И это не так (хотя это работает в Excel 2013)

mobjWebReq.Send PostData

Похоже, во втором случае PostData просто игнорируется, и проблема не связана с типом объекта. По совпадению, когда я использовал объект ServerXMLHTTP, я также использовал круглые скобки.

person RuudSieb    schedule 04.10.2016