webservice登录前设置cookieContainer问题

永生天地 2010-01-21 12:51:21
我需要访问的webservice,首先需要进行登录login(username,password)
这个没问题,返回值正确。可以在log文件中看到,见后面的log

可是,文档上明确指出:登录前必须实例化 cookieContainer
WebService.WebServiceCore core = new WebService.WebServiceCore();
core.CookieContainer = new System.Net.CookieContainer();

在pb里怎么能把上面的方法实现呢,否则,其他的函数返回都是有问题的


日志记录:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetTknResponse xmlns="http://tempuri.org/"><GetTknResult /></GetTknResponse></soap:Body></soap:Envelope>Connection Cached

CLOSED


REQUEST:
CLOSED
POST /ws403/webservicecore.asmx HTTP/1.1
Host: edoc2.dalianhonour.com:8081
Connection: Keep-Alive
User-Agent: EasySoap++/0.6
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/Login"
Content-Length: 483

<E:Envelope
xmlns:E="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:A="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:s="http://www.w3.org/2001/XMLSchema-instance"
xmlns:y="http://www.w3.org/2001/XMLSchema"
E:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<E:Body>
<m:Login
xmlns:m="http://tempuri.org/">
<m:userName
s:type="y:string">username</m:userName>
<m:password
s:type="y:string">password</m:password>
</m:Login>
</E:Body>
</E:Envelope>



RESPONSE:
HTTP/1.1 200 OK
Date: Wed, 20 Jan 2010 16:52:17 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=k1jf3t45ietasa45vltgwm55; path=/; HttpOnly
Set-Cookie: tkn=1a6691fd-ed9b-4609-8de0-37d8b8a33b8c; path=/
Set-Cookie: jueLng=zh-cn; path=/
Set-Cookie: jueTheme=Asia/Shanghai; path=/
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Content-Length: 333

服务器的响应里有几个set-cookie,谁能给解释一下这个在pb里怎么用
...全文
827 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
weihuabin21cn 2010-08-06
  • 打赏
  • 举报
回复
非常好的文章
yqqlm2009 2010-04-09
  • 打赏
  • 举报
回复
PB115 新增了对 Cookie的支持,更新最新的PB115,你的问题应该能解决
圣殿骑士18 2010-01-25
  • 打赏
  • 举报
回复
没看懂,先mark
wixinyoyo 2010-01-23
  • 打赏
  • 举报
回复
不懂 帮忙顶。。。
WorldMobile 2010-01-22
  • 打赏
  • 举报
回复
#if defined PBDOTNET then
System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();
MyService.WebService service = new System.Net.App.MyService.WebService();
service.CookieContainer = cookieContainer;
#end if
WorldMobile 2010-01-22
  • 打赏
  • 举报
回复

使用ASP.Net Forms模式实现WebService身份验证
时间:2008-02-22 09:39来源:互联网
在安全性要求不是很高的ASP.Net程序中,基于Forms的身份验证是经常使用的一种方式,而如果需要对WebService进行身份验证,最常用的可能是基于Soap 标头的自定义身份验证方式。如果对两者做一下比较的话,显然,基于Forms的验证方式更加方便易用,能否将Forms验证方式应
  

在安全性要求不是很高的ASP.Net程序中,基于Forms的身份验证是经常使用的一种方式,而如果需要对WebService进行身份验证,最常用的可能是基于Soap 标头的自定义身份验证方式。如果对两者做一下比较的话,显然,基于Forms的验证方式更加方便易用,能否将Forms验证方式应用到 WebService中去呢?
从理论上讲,使用基于Forms的方式对WebService进行身份验证是可行的,但是使用过程中会存在以下两个问题:
1.基于Forms的验证方式同时也是基于Cookie的验证方式,在使用浏览器时,这个问题是不需要我们考虑的。但对于使用WebService的应用程序来说,默认是不能保存Cookie的,需要我们自己去做这个工作。
2.WebService既然是一个A2A(Application To Application)应用程序,使用Web表单进行身份验证显然不太合适,而且,这将不可避免的造成人机交互,使WebService的应用大打折扣。
接下来,我们就分步解决这两个问题:
1.Cookie的保存问题
WebService的客户端代理类有一个属性CookieContainer可用于设置或获取Cookie集合,保存Cookie的任务就交给他了:

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

MyService.WebService service = new App.MyService.WebService();
service.CookieContainer = cookieContainer;
2.我们不想使用Web表单进行身份验证,幸运的是,ASP.Net表单验证中的表单页(即Web.config文件中 forms 元素内的loginUrl)同样可以指定为WebService文件。
我们创建一个专门用作身份验证的Web服务,暂且命名为Login.asmx,然后让 loginUrl 等于 “Login.asmx”,当然,还需要在Web.config文件中的 authorization 节中禁止匿名访问(否则我们可就白忙活了),完成配置后的Web.config文件如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="false" />
<authentication mode="Forms">
<forms name="MyService" loginUrl="Login.asmx"></forms>
</authentication>
<authorization >
<deny users="?"/>
</authorization>
</system.web>
</configuration>

其实我们并不想在未通过身份验证时让浏览器转向到Login.asmx,对于使用WebService的客户程序来说,真正的实惠在于:可以匿名访问 Login.asmx中的方法(当然我们也可以把Login.asmx放在单独的目录中,然后允许对该目录的匿名访问来达个这个目的,但我觉得还是用 loginUrl更优雅一些)。
接下来,我们为Login.asmx添加用于身份验证的WebMethod:

[WebMethod]
public bool Check(string userName,string password)
{
if (userName == "aaaaaa" && password == "123456")//添加验证逻辑
{
System.Web.Security.FormsAuthentication.SetAuthCookie(userName, false);
return true;
}
else
{
return false;
}
}
最后一步工作就是:让客户程序中的WebService实例与Login实例共享CookieContainer。

class Sample
{
System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();

public void Login()
{
MyServiceLogin.Login login = new App.MyServiceLogin.Login();
login.CookieContainer = cookieContainer;
login.Check("aaaaaa", "123456");
}

public void ShowHelloWorld()
{
MyService.WebService service = new App.MyService.WebService();
service.CookieContainer = cookieContainer;

Console.WriteLine(service.HelloWorld());
}
}
Login()以后再ShowHelloWorld(),你是否看到了我们熟悉的“Hello World”?Ok,就这么简单
WorldMobile 2010-01-22
  • 打赏
  • 举报
回复
用pb11以上版本,直接引用.net即可

#if defined PBDOTNET then
//代码
#end if

662

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder Web 应用
社区管理员
  • Web 应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧