使用需要cookie的asp.net调用Web服务

时间:2014-03-03 06:21:31

标签: c# asp.net web-services html-agility-pack

我正在尝试使用HTML Agility Pack来查找http://www.dlapiper.com/global/people/search.aspx?gLastName=A的律师名单。该站点使用Ajax来填充名称,所以我没有运气这个服务器端。我注意到该网站正在http://www.dlapiper.com/FCWSite/DlaPiperWS/Attorneys.asmx?op=FindAttorneys调用一个Web服务,所以我试图从我的应用程序中调用相同的Web服务。

我正在使用以下代码,但它返回内部服务器错误500,我怀疑是因为我需要一个会话cookie? (因为如果我禁用cookie,该网站不起作用)

有人可以帮忙吗?

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;
}

1 个答案:

答案 0 :(得分:1)

正如我在评论中所述......我在我的项目中添加了Attorney.asmx网址作为网络参考。

这样做时,我让web引用的引用名称为'com.dlapiper.www'。

以下内容位于vb.net中,代表标准默认页面。 com.dlapiper.www.Attorneys类代表连接的上下文。

请注意,Attorneys.FindAttorney返回一个字符串值..

另外,你可以从我的缓冲区和array.convertAll中看到代码尝试,我正在尝试不同的编码..如果你试图调用FindAttorney而不添加cookie容器和以下的cookie ...你会错误地得到一个SOAP异常,说明localizationGUID没有正确输入。

我在代码中留下了一些不相关的部分,因为我是逆变编程的粉丝。

事实是,该参数不能为空,但实际上并未被函数使用.. cookie名称:值为。

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