Сбой вызова веб-службы с состоянием HTTP 400 Bad Request - PullRequest
0 голосов
/ 07 августа 2010

В моем веб-приложении происходит сбой при вызове веб-службы:

Ошибка сервера в приложении '/ zVersion2a'. Запрос не выполнен с HTTP-статусом 400: неверный запрос.

Вот ссылка на сам веб-сервис (это работает):

http://www.zipeee.com/Zipeeewebservice/

Вот ссылка на веб-приложение [production], которое вызывает WS при первой загрузке страницы:

http://www.zipeee.com/Zipeee/

Вот ссылка на веб-приложение [newVersion], которое не может вызвать тот же WS:

http://www.zipeee.com/zVersion2/

Вот источник на странице вызова:

Imports System.Data
Partial Class frmZipeee
Inherits System.Web.UI.Page
Public wsZipeee As New ProxyZipeeeService.WSZipeee.Zipeee
Dim dsStandardMsg As DataSet
Dim dtStandardMsg As DataTable
Dim dsRandomMsg As DataSet
Dim dtRandomMsg As DataTable
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not Page.IsPostBack Then
        LoadMessage()
    End If
End Sub
Private Sub LoadMessage()
    Dim iCnt As Integer
    Dim iValue As Integer

    dsStandardMsg = Nothing
    dsStandardMsg = wsZipeee.GetMessageByType(BizConstants.MsgType.Standard)
    iCnt = dsStandardMsg.Tables(0).Rows.Count
        If iCnt = 0 Then
            Me.btnEnter.Text = "Click Here to Enter."
        Else
            Me.btnEnter.Text = dsStandardMsg.Tables(0).Rows(0).Item("MessageContent")
        End If
    dsStandardMsg.Dispose()
End Sub
End Class

Вот код из Reference.vb в прокси :

<System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/ZipeeeWebService/Zipeee/Get Message By Type", RequestElementName:="Get Message By Type", RequestNamespace:="http://tempuri.org/ZipeeeWebService/Zipeee", ResponseElementName:="Get Message By TypeResponse", ResponseNamespace:="http://tempuri.org/ZipeeeWebService/Zipeee", Use:=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)>  _
    Public Function GetMessageByType(ByVal iMsgType As Integer) As <System.Xml.Serialization.XmlElementAttribute("Get Message By TypeResult")> System.Data.DataSet
        Dim results() As Object = Me.Invoke("GetMessageByType", New Object() {iMsgType})
        Return CType(results(0),System.Data.DataSet)
    End Function

Наконец, вот код в веб-службе :

   <WebMethod(MessageName:="Get Message By Type")> _
           Public Function GetMessageByType(ByVal iMsgType As Integer) As DataSet
    Try
        'create a connection...
        con = New SqlConnection(sConnZipeee)
        con.Open()
        command = New SqlCommand("spGetMessageByType", con)
        command.CommandType = CommandType.StoredProcedure
        AppendParm(command, "@MessageType", SqlDbType.Int, iMsgType)
        Dim adp As SqlDataAdapter = New SqlDataAdapter(command)
        Dim ds As New DataSet
        adp.Fill(ds, "TableMsg")
        adp.Dispose()
        command.Dispose()
        con.Close()
        Return ds
    Catch ex As SqlException
     ...etc.                'As I read the trace output (below) we never got here nor to SQL

На этом рабочем веб-сервере под управлением IIS 6.0 Windows 2003 на веб-сайте по умолчанию есть 3 виртуальных каталога (Zipeee, zVersion2, ZipeeeWebService).

Каждый виртуальный каталог указывает на отдельный физический каталог на диске c веб-сервера. И производственная версия Zipeee, и новая версия zVersion2 используют прокси-класс с именем ProxyZipeeeService.dll . Я очень внимательно относился к публикации основного проекта Zipeee и веб-сервисов, в которых он нуждается. Например, на сервере разработки с использованием Visual Studio2008 я собрал и протестировал все 5 проектов (webservice1, webservice2, primarywebapp (i.e.zipeee), proxyclassforWS1, proxyclassforWS2). Новейшие версии всех этих DLL были помечены версией сборки, выбранной как 1.6. Все они работают на моей машине разработчика, и я опубликовал WS1, WS2 и zipeee на промежуточном сервере (IIS 6.0), и все они тоже там работают. Затем я публикую на общедоступном сервере, на котором размещены указанные выше URL. Новая версия веб-приложения помещается в отдельные папки на диске c и указывается vDir zVersion2. Он должен работать, но не может отобразить даже первую страницу из-за этой ошибки WS.

Я отследил сбой zVersion2 (он вызывает веб-метод GetMessageByType в событии загрузки страницы и сразу завершается с ошибкой). Вот оно (не очень длинное, но форматирование в SO немного грязное):

Информация о System.Web.Services.Asmx: 0: вызов XmlSerializer [Create XmlSerializer] Метод: System.Xml.Serialization.XmlSerializer # 1669721556 :: FromMappings (System.Xml.Serialization.XmlMapping [] # 40041277 = [356], ProxyZipeeeService.WSZipeee.Zipeee # 50200644 = ProxyZipeeeService.WSZipeee.ipe) Звонящий: System.Web.Services.Protocols.SoapClientType # 24827179 ::. Ctor (ProxyZipeeeService.WSZipeee.Zipeee # 50200644 = ProxyZipeeeService.WSZipeee.Zipeee) ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 45.6541439Z Отметка = 47298006836 Информация System.Web.Services.Asmx: 0: Возврат из XmlSerializer [Создать XmlSerializer] Звонящий: System.Web.Services.Protocols.SoapClientType # 24827179 ::. Ctor (ProxyZipeeeService.WSZipeee.Zipeee # 50200644 = ProxyZipeeeService.WSZipeee.Zipeee) ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 45.7791255Z Отметка = 47298376293 Информация System.Web.Services.Asmx: 0: вызов XmlSerializer [Создать XmlSerializer] Метод: System.Xml.Serialization.XmlSerializer # 1669721556 :: FromMappings (System.Xml.Serialization.XmlMapping [] # 64844482 = [160], ProxyEmergencyService.WSEmergency.Emergency # 88831384 = ProxyEmergencyService.WSEmergency.Emergency) Вызывающая сторона: System.Web.Services.Protocols.SoapClientType # 46729429 ::. Ctor (ProxyEmergencyService.WSEmergency.Emergency # 88831384 = ProxyEmergencyService.WSEmergency.Emergency) ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 45.8572390Z Отметка = 47298680452 Информация System.Web.Services.Asmx: 0: Возврат из XmlSerializer [Создать XmlSerializer] Вызывающая сторона: System.Web.Services.Protocols.SoapClientType # 46729429 ::. Ctor (ProxyEmergencyService.WSEmergency.Emergency # 88831384 = ProxyEmergencyService.WSEmergency.Emergency) ProcessId = 1456 LogicalOperationStack =ThreadId = 1 DateTime = 2010-08-06T01: 58: 45.9353525Z Отметка = 47298924420 Информация System.Web.Services.Asmx: 0: вызов XmlSerializer [Запрос на запись] Метод: Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer192 # 13256970 :: Serialize (System.Xml.XmlTextWriter # 52203868 = .., System.Object [] # 72766 = [1], (null), (null)) Абонент: ProxyZipeeeService.WSZipeee.Zipeee # 654897 :: Serialize () ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 46.0915795Z Отметка = 47299598906 Информация System.Web.Services.Asmx: 0: возврат из XmlSerializer [запрос на запись] Абонент: ProxyZipeeeService.WSZipeee.Zipeee # 654897 :: Serialize () ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 46.0915795Z Отметка = 47299606361 Информация System.Web.Services.Asmx: 0: вызов WebRequest.GetResponse Метод: System.Net.HttpWebRequest # 5894079 :: GetResponse () Абонент: ProxyZipeeeService.WSZipeee.Zipeee # 654897 :: GetWebResponse () ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 46.0915795Z Отметка = 47299607492 System.Web.Services.Asmx Ошибка: 0: исключение обнаружено в ProxyZipeeeService.WSZipeee.Zipeee # 654897 :: GetWebResponse. System.Net.WebException: удаленный сервер возвратил ошибку: (400) неверный запрос. ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 46.0915795Z Отметка = 47299629487 Ошибка System.Web.Services.Asmx: 0: Сведения об исключении: System.Net.WebException: удаленный сервер возвратил ошибку: (400) неверный запрос. в System.Net.HttpWebRequest.GetResponse () в System.Web.Services.Protocols.WebClientProtocol.GetWebResponse (запрос WebRequest) ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 46.0915795Z Отметка = 47299654807 Информация System.Web.Services.Asmx: 0: вызов XmlSerializer [Запрос на запись] Метод: Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer192 # 13256970 :: Serialize (System.Xml.XmlTextWriter # 53046711 = .., System.Object [] # 7658356 = [1], (null), (null) Абонент: ProxyZipeeeService.WSZipeee.Zipeee # 1816341 :: Serialize () ProcessId = 1456 LogicalOperationStack = ThreadId = 1 DateTime = 2010-08-06T01: 58: 56.9024879Z Отметка = 47338202360

Ответы [ 2 ]

0 голосов
/ 19 августа 2010

Как отмечалось выше, основной сайт использовал прокси-библиотеки DLL для связи с веб-службами.В Visual Studio каждый проект Proxy имел веб-ссылку (файл .wsdl и т. Д.) И сгенерированный файл app.config.В одном из этих двух прокси-проектов файл app.config сохранил исходные настройки (которые, конечно, работали на моем настольном компьютере разработчика и моем промежуточном веб-сервере):

<applicationSettings>
    <ProxyZipeeeService.My.MySettings>
        <setting name="ProxyZipeeeService_WSZipeee_Zipeee" serializeAs="String">
            <value>http://localhost/ZipeeeWebService/Zipeee.asmx</value>
        </setting>
    </ProxyZipeeeService.My.MySettings>
</applicationSettings>

Обратите внимание на localhost *Значение 1005 * выше.

Оказывается, что при развертывании на рабочем сервере значение заголовка узла для веб-сайта по умолчанию и другого веб-сайта на том же компьютере IIS существует.Позже я узнал больше о последствиях этой настройки и понял, что, когда основной сайт пытался получить доступ к веб-службе через localhost, он терпел неудачу, потому что localhost не был найден среди 2 значений заголовка хоста.Поэтому возвращение в Vstudio и изменение веб-ссылки следующим образом решило проблему:

<applicationSettings>
    <ProxyZipeeeService.My.MySettings>
        <setting name="ProxyZipeeeService_WSZipeee_Zipeee" serializeAs="String">
            <value>http://www.zipeee.com/ZipeeeWebService/Zipeee.asmx</value>
        </setting>
    </ProxyZipeeeService.My.MySettings>
</applicationSettings>
0 голосов
/ 07 августа 2010

Попробуйте сделать следующее: 1. Добавьте новую ссылку на службу с именем wsZipeee, указывающую на веб-службу 2. В месте вызова (другое веб-приложение, Winform и др.):

Dim ws as New wsZipeee.ZipeeeSoapClient()
Dim dsStandardMsg As DataSet 
dsStandardMsg = ws.GetMessageByType(BizConstants.MsgType.Standard)

Создав новую ссылку на службу, она будет обрабатывать прокси-сервер и позволит вам точно вызывать его. Я предполагаю название справочной службы, веб-службы и метода, который вы хотите вызвать

...