Отправка файла cookie через вызов веб-службы в .NET - PullRequest
3 голосов
/ 04 января 2012

У меня проблема с установкой файла cookie для вызова веб-службы в .NET. Перед использованием любого из вызовов wsdl, я должен предоставить файл cookie, полученный при входе на веб-сайт клиента. У меня есть метод для входа и получения cookie, где я затем передаю его в мой метод makeSearch (показанный ниже). Как вы видите, я устанавливаю cookie в cookieContainer для объекта wsdl; однако, когда я проверяю запрос, сделанный моим методом AdvancedSearch, я замечаю в fiddler, что куки не отправляются. Клиент предоставил решение на Java, но у меня возникла проблема с переносом этого на .NET.

Ниже приведено решение в коде Java: (порт - это переданный объект wsdl)

private static void setupClient(Object port, final String cookie) throws Exception {
    Client client = ClientProxy.getClient(port); 
    HTTPConduit http = (HTTPConduit) client.getConduit();
    HTTPClientPolicy policy = http.getClient();
    if (policy == null) {
        policy = new HTTPClientPolicy();
        http.setClient(policy);
    }
    policy.setCookie(cookie);
    policy.setAutoRedirect(true);
}

Мой код следующий:

public AdvancedSearchResult makeSearch(String cookie){
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
AdvancedSearchResult searchResults = new AdvancedSearchResult();
Cookie cook= new Cookie("NAME", HttpUtility.UrlEncode(cookie));
searches.CookieContainer = new CookieContainer();
searches.CookieContainer.Add(newUri(www.test.com),cook);
searchResults = searches.AdvancedSearch("search params");
return searchResults;

}

Кто-нибудь может перечислить какие-либо идеи или решения?

1 Ответ

4 голосов
/ 17 января 2012

У меня только что была такая же проблема, и вот как я ее решил

var tmWebServices             = new TM_WebServices();
tmWebServices.CookieContainer = new System.Net.CookieContainer();
tmWebServices.Url             = Test_TM.tmWebServices;

var username     = "reader";  
var passwordHash = Test_TM.passwordHash_Reader;
var sessionID    =  tmWebServices.Login(username, passwordHash);

//Note that this is optional if you set these cookies from the server side
var cookie       =  new System.Net.Cookie("Session",sessionID.str());
tmWebServices.CookieContainer.Add(tmWebServices.Url.uri() , cookie); 

var guidanceItemID = "0c85a318-0c32-4417-9d72-7475bb96517e".guid();

var guidanceItemHtml = tmWebServices.GetGuidanceItemHtml(guidanceItemID);

return "{0}".format(guidanceItemHtml);


//using O2.SecurityInnovation.TeamMentor
//O2File:TM_WebServices.cs
//O2File:Test_TM_Config.cs
//O2Ref:System.Web.Services.dll

Ключ добавлял

tmWebServices.CookieContainer = new System.Net.CookieContainer();

, что делало куки, отправленные с сервера, для повторной отправкина дальнейшие запросы.

В приведенном выше примере, если вы вызываете GetGuidanceItemHtml без действительного значения файла cookie сеанса, вы получите исключение безопасности (на стороне сервера есть требование безопасности CAS)

...