Appeler un service Web avec asp.net nécessitant des cookies

asp.net c# html-agility-pack web-services

Question

J'essaie d'utiliser le pack d'agilité HTML pour extraire la liste des avocats à l' adresse http://www.dlapiper.com/global/people/search.aspx?gLastName=A . Le site utilise Ajax pour renseigner les noms, je n'ai donc pas eu la moindre chance de ce côté serveur. J'ai remarqué que le site appelle un service Web à l' adresse http://www.dlapiper.com/FCWSite/DlaPiperWS/Attorneys.asmx?op=FindAttorneys , j'essaie donc d'appeler le même service Web à partir de mon application.

J'utilise le code suivant, mais une erreur de serveur interne 500 est renvoyée, ce qui, je suppose, est dû au fait que j'ai besoin d'un cookie de session. (car le site ne fonctionne pas si je désactive les cookies)

Quelqu'un peut-il aider?

private static string WebServiceCall()
{

    WebRequest webRequest = WebRequest.Create("http://www.dlapiper.com/FCWSite/DlaPiperWS/Attorneys.asmx?op=FindAttorneys");
    HttpWebRequest httpRequest = (HttpWebRequest)webRequest;
    httpRequest.Method = "POST";
    httpRequest.ContentType = "text/xml; charset=utf-8";
    httpRequest.Headers.Add("SOAPAction: http://tempuri.org/");
    httpRequest.ProtocolVersion = HttpVersion.Version11;
    Stream requestStream = httpRequest.GetRequestStream();
    //Create Stream and Complete Request             
    StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.ASCII);
    string request = "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body><FindAttorneys xmlns='FCWSite.FCWSite.DlaPiperWS'><scFirstName></scFirstName><scLastName>A</scLastName><scKeyword></scKeyword><scOfficesGUID></scOfficesGUID><scSpokenLanguagesGUID></scSpokenLanguagesGUID><scServicesGUID></scServicesGUID><scRegionGUID></scRegionGUID><scSchoolGUID></scSchoolGUID><scAdmissionGUID></scAdmissionGUID><scLevelGUID></scLevelGUID><strLanguageGUID>7483b893-e478-44a4-8fed-f49aa917d8cf</strLanguageGUID><strCountry>global</strCountry><returnUntranslated>true</returnUntranslated><sortBy>name</sortBy><page>0</page></FindAttorneys></soap:Body></soap:Envelope>";

    streamWriter.Write(request);
    streamWriter.Close();
    //Get the Response    
    HttpWebResponse wr = (HttpWebResponse)httpRequest.GetResponse();
    StreamReader srd = new StreamReader(wr.GetResponseStream());
    string resulXmlFromWebService = srd.ReadToEnd();
    return resulXmlFromWebService;
}

Réponse acceptée

Comme je l'ai dit dans mon commentaire, j'ai ajouté l'URL Attorney.asmx comme référence Web dans mon projet.

Ce faisant, je laisse à la référence Web l’espace de nom de la référence être «com.dlapiper.www».

Ce qui suit est dans vb.net, et représente une page standard par défaut. La classe com.dlapiper.www.Attorneys représente le contexte de la connexion.

Notez que Attorneys.FindAttorney renvoie une valeur de chaîne.

En outre, vous pouvez voir dans mon code et dans la tentative array.convertAll du code que j'essayais différents codages .. si vous essayez d'appeler FindAttorney sans ajouter le conteneur de cookies et les cookies suivants .. vous obtiendrez une exception SOAP indiquant que la localisationGUID n'était pas dans une entrée correcte.

J'ai laissé cette partie du code sans importance parce que je suis un partisan de la programmation contravariante.

la vérité est que ce paramètre ne peut pas être vide, mais n'est pas réellement utilisé par la fonction .. le nom du cookie: la valeur est.

VB.NET

Public Class _Default
    Inherits System.Web.UI.Page

    Dim AttorneyList As com.dlapiper.www.Attorneys = New com.dlapiper.www.Attorneys()
    Dim attys As String

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim buffer As Byte()
        buffer = Array.ConvertAll(Of Char, Byte)("7483b893e47844a48fedf49aa917d8cf".ToUpper.ToCharArray(), New Converter(Of Char, Byte)(AddressOf CharToBuffer))

        Dim cookieLanguage As System.Net.Cookie = New System.Net.Cookie
        cookieLanguage.Domain = "www.dlapiper.com"
        cookieLanguage.Name = "Language"
        cookieLanguage.Value = UTF8Encoding.ASCII.GetString(buffer)
        cookieLanguage.Path = "/"

        Dim cookieLocalization As System.Net.Cookie = New System.Net.Cookie
        cookieLocalization.Domain = "www.dlapiper.com"
        cookieLocalization.Name = "Localization"
        cookieLocalization.Value = "TimeZone=0&UsesDaylightSavings=False&TimeZoneAbbrev=IDLW&Persists=True"
        cookieLocalization.Path = "/"

        Dim cookieCulture As System.Net.Cookie = New System.Net.Cookie
        cookieCulture.Domain = "www.dlapiper.com"
        cookieCulture.Name = "DefaultCulture"
        cookieCulture.Value = "en-US"
        cookieCulture.Path = "/"

        Dim cookieHideNotice As System.Net.Cookie = New System.Net.Cookie
        cookieHideNotice.Domain = "www.dlapiper.com"
        cookieHideNotice.Name = "hide-cookie-notice"
        cookieHideNotice.Value = "1"
        cookieHideNotice.Path = "/"

        Dim cookieMode As System.Net.Cookie = New System.Net.Cookie
        cookieMode.Domain = "www.dlapiper.com"
        cookieMode.Name = "Mode"
        cookieMode.Value = "1"
        cookieMode.Path = "/"

        Dim cookieNavId As System.Net.Cookie = New System.Net.Cookie
        cookieNavId.Domain = "www.dlapiper.com"
        cookieNavId.Name = "NavId"
        cookieNavId.Value = "1074"
        cookieNavId.Path = "/"

        Dim cookiePortletId As System.Net.Cookie = New System.Net.Cookie
        cookiePortletId.Domain = "www.dlapiper.com"
        cookiePortletId.Name = "PortletId"
        cookiePortletId.Value = "12601"
        cookiePortletId.Path = "/"

        Dim cookieSERVER_PORT As System.Net.Cookie = New System.Net.Cookie
        cookieSERVER_PORT.Domain = "www.dlapiper.com"
        cookieSERVER_PORT.Name = "SERVER_PORT"
        cookieSERVER_PORT.Value = "80"
        cookieSERVER_PORT.Path = "/"

        Dim cookieSiteId As System.Net.Cookie = New System.Net.Cookie
        cookieSiteId.Domain = "www.dlapiper.com"
        cookieSiteId.Name = "SiteId"
        cookieSiteId.Value = "1039"
        cookieSiteId.Path = "/"

        Dim cookieZoneId As System.Net.Cookie = New System.Net.Cookie
        cookieZoneId.Domain = "www.dlapiper.com"
        cookieZoneId.Name = "ZoneId"
        cookieZoneId.Value = "8"
        cookieZoneId.Path = "/"

        Dim cookieEventingStatus As System.Net.Cookie = New System.Net.Cookie
        cookieEventingStatus.Domain = "www.dlapiper.com"
        cookieEventingStatus.Name = "EventingStatus"
        cookieEventingStatus.Value = "1"
        cookieEventingStatus.Path = "/"


        AttorneyList.CookieContainer = New System.Net.CookieContainer()

        AttorneyList.CookieContainer.Add(cookieLanguage)
        AttorneyList.CookieContainer.Add(cookieLocalization)
        AttorneyList.CookieContainer.Add(cookieCulture)
        AttorneyList.CookieContainer.Add(cookieMode)
        AttorneyList.CookieContainer.Add(cookieEventingStatus)
        AttorneyList.CookieContainer.Add(cookieNavId)
        AttorneyList.CookieContainer.Add(cookieSiteId)
        AttorneyList.CookieContainer.Add(cookieSERVER_PORT)
        AttorneyList.CookieContainer.Add(cookieHideNotice)
        AttorneyList.CookieContainer.Add(cookiePortletId)
        AttorneyList.CookieContainer.Add(cookieZoneId)

        'UTF8Encoding.ASCII.GetString(buffer)
        attys = AttorneyList.FindAttorneys("B", "", "", "", "", "", "", "", "", "", UTF8Encoding.ASCII.GetString(buffer), "global", False, "name", 0)
        Response.Write(attys)
    End Sub

    Function CharToBuffer(ByVal character As Char) As Byte
        Return Convert.ToByte(character)
    End Function
End Class



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi