您的位置:首页 > 其它

Web Service通过SoapHeader身份验证

2013-03-22 14:58 495 查看
服务端Web Service

1、创建WebService基类,包含身份验证方法

using System;
using System.Collections.Generic;
using System.Web.Services.Protocols;

namespace Demo.WebService
{
/// <summary>
/// WebService基类
/// </summary>
public class WebServiceBase : System.Web.Services.WebService
{
private CredentialSoapHeader credentials;
public CredentialSoapHeader Credentials
{
get
{
if (this.credentials == null)
this.credentials = new CredentialSoapHeader();
return credentials;
}
set
{
credentials = value;
}
}
protected void VerifyCredentials()
{
if (this.Credentials == null || string.IsNullOrEmpty(this.Credentials.Username) || string.IsNullOrEmpty(this.Credentials.Password))
{
throw new SoapException("请输入用户名或密码.", SoapException.ClientFaultCode, "用户登录");
}
bool result = (this.Credentials.Username == "admin" && this.Credentials.Password == "123456");
if (result == false)
{
throw new SoapException("用户名或密码错误.", SoapException.ClientFaultCode, "用户登录");
}
}
}
/// <summary>
/// 用于身份验证的类
/// </summary>
public class CredentialSoapHeader : SoapHeader
{
public string Username { get; set; }
public string Password { get; set; }
}
}

2、WebService继承基类WebServiceBase,在要调用的方法中调用基类的验证方法

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;

namespace Demo.WebService
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]

public class HelloService : WebServiceBase
{
[WebMethod]
[SoapHeader("Credentials")]
public string HelloWorld()
{
base.VerifyCredentials();
return "Hello World";
}
}
}


客户端WinForm

(1)添加Web Service调用:
http://localhost/HelloService/HelloService.asmx
(2)获取Web Service封装一个方法

public class ServiceFactory
{
public static HelloService.HelloService GetHelloService(string username, string password)
{
var service = new HelloService.HelloService()
{
CredentialSoapHeaderValue = new HelloService.CredentialSoapHeader()
{
Username = username,
Password = password
}
};
return service;
}
}


(3)调用:

private void button1_Click(object sender, EventArgs e)
{
HelloService.HelloService service = ServiceFactory.GetHelloService("admin","123456");
try
{
string msg = service.HelloWrold();
MessageBox.Show(msg);
}
catch (Exception ex)
{
string err = ex.Message;
if (err.Contains("登陆失败"))
MessageBox.Show("用户名或密码错误!");
else
MessageBox.Show("登录失败,异常信息:" + err);
}
}


备注:

如果第一次调用Web service响应速度慢,则解决办法如下:

在配置文件中(.config)中添加配置节:

<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>


NET4.0中的默认代理是开启的,而我并没有设置!故只有等待超时后才会绕过代理,这就阻塞了.

/article/2708239.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: