0

如何将类库里Web服务配置节的内容移到主程序中

by 刘武 18. 六月 2009 21:12

项目中需要在数据访问层中添加Web引用,因此系统会在该类库中自动生成一个APP.CONFIG文件,里面包含了Web服务的地址。可惜的是,如果在主程序中添加对该类库的引用,系统并不会帮你生成该类库的配置节,那么如何在主程序中配置类库中的内容呢? 其实很简单,只要将类库的APP.CONFIG中的相关内容复制到主程序中即可。如以下是数据访问层DataAccess的APP.CONFIG文件中的内容:


<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="DataAccess.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <DataAccess.Properties.Settings>
      <setting name="DataAccess_Liuwu_Net_WebService" serializeAs="String">
        <value>http://liuwu.net:9823/AJAXEnabledWebSite1/WebService.asmx</value>
      </setting>
    </DataAccess.Properties.Settings>
  </applicationSettings>
</configuration>

我们只要将其中的sectionGroup和applicationSettings的内容复制到主程序的APP.CONFIG文件中即可,以下是主程序的APP.CONFIG:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="DataAccess.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <DataAccess.Properties.Settings>
      <setting name="DataAccess_Liuwu_Net_WebService" serializeAs="String">
        <value>http://liuwu.net:9823/AJAXEnabledWebSite1/WebService.asmx</value>
      </setting>
    </DataAccess.Properties.Settings>
  </applicationSettings>
  <appSettings>
    <add key="Hello" value="1234"/>
  </appSettings>
</configuration>

同理,如果还有其他类似的项目,只要将相关的配额节追加到主程序的APP.CONFIG文件中即可。

Tags: ,

技术生涯

0

SoapHeader实践之客户端验证

by 刘武 9. 六月 2009 21:00

编写Webservice时经常需要对用户的身份进行认证,我们可以给用户一个令牌,然后在每个方法签名中增加该令牌做为参数,以此来验证用户的合法性。但这杨就必须修改所有的方法签名,很显然是难以维护的。因此我们要尽量避免修改方法签名,而使用SoapHeader恰好可以满足我们的需求,通过将令牌保存在SoapHeader类中来实现在客户端和服务端的传送。以下是具体的操作流程:

一 自定义SoapHeader类

public class MyHeader :SoapHeader
{
    public MyHeader() { }

    private string _token = "";
    public string Token
    {
        get { return _token; }
        set { _token = value; }
    }
}

注意一定要继承SoapHeader

二 编写Webservice

[WebService(Namespace = "http://www.liuwu.net/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
    public MyHeader header;
  
    [WebMethod]
    [SoapHeader("header")]
    public bool IsRightUser()
    {
        return CheckToken();
    }

    /// <summary>
    /// 验证令牌
    /// </summary>
    /// <remarks>
    ///此处仅供演示,根据实际情况可添加更加复杂的验证过程
    ///</remarks>
    /// <returns></returns>
    private bool CheckToken()
    {
        if (header != null && header.Token == "123")
        {
            return true;
        }

        return false;
    }
}

我们声明了MyHeader类的实例header,并且在IsRightUser函数中增加了SoapHeader属性,指明使用header来保存他的值。

三 客户端调用

新建winform应用程序,并添加web引用,引用名为:SoapHeaderTest,具体调用方法如下

SoapHeaderTest.MyHeader header =
 new SoapHeaderTest.MyHeader();
header.Token = "123";
SoapHeaderTest.WebService ws =
 new SoapHeaderTest.WebService();
ws.MyHeaderValue = header;
bool b = ws.IsRightUser();
注意必须给ws的MyHeaderValue赋值

Tags: , ,

技术生涯

0

在asp.net webservice中如何使用session

by 刘武 17. 三月 2009 22:11

在使用asp.net编写webservice时,默认情况下是不支持session的,但我们可以把WebMethod的EnableSession选项设为true来显式的打开它,请看以下例子:

1 新建网站WebSite 

2 新建web服务WebService.asmx,它具有以下两个方法:

[WebMethod(EnableSession = true)]
public string Login(string name)
{
    Context.Session["name"] = name;
    return name;
}

[WebMethod(EnableSession = true)]
public string GetName()
{
    if (Context.Session["name"] != null)
        return Context.Session["name"].ToString();
    else
        return "";
}

3 添加asp.net页面SessionInWebservice.aspx


<form id="form1" runat="server">
    <div>
        <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
        <asp:Button ID="btnLogin" runat="server"
            Text="Login" OnClick="btnLogin_Click" />
    </div>
    <div>
        <asp:Button ID="btnGetName" runat="server"
            Text="GetName" OnClick="btnGetName_Click" />
        <asp:Label ID="lblName" runat="server" Text="Label"></asp:Label>
    </div>
</form>

SessionInWebservice.aspx.cs

protected void btnLogin_Click(object sender, EventArgs e)
{
    WebService ws = new WebService();
   
    ws.Login(txtName.Text);
}
protected void btnGetName_Click(object sender, EventArgs e)
{
    WebService ws = new WebService();
    lblName.Text = ws.GetName();
}

问题似乎到此结束了,按Login按钮记录用户名以后,再按GetName就可以获取到刚才输入的名字。

但如果我们另外新建一个website,并添加web引用来调用刚才编写的webservice,问题就出来了,GeName方法并没有获取到我们刚才登录的用户名(如果是在winform中调用该方法,也会出现同样的问题)。莫非这个方法行不通了?

其实不然,我们给该WebService的CookieContainer赋值就可以了,修改SessionInWebservice.aspx.cs 的代码:

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

protected void btnLogin_Click(object sender, EventArgs e)
{
    localhost.WebService ws = new localhost.WebService();
    ws.CookieContainer = cookieContainer;
    ws.Login(txtName.Text);
}
protected void btnGetName_Click(object sender, EventArgs e)
{
    localhost.WebService ws = new localhost.WebService();
    ws.CookieContainer = cookieContainer;
    lblName.Text = ws.GetName();
}

请注意:Login方法和GetName方法必须指定同一个CookieContainer,因此在这里我们使用了静态变量。

但如果是在不同的页面中调用该webservice,问题依旧存在,因此我们需要重新修改代码,通过编写新类继承上面的webservice,并给CookieContainer赋值就可以解决该问题了: 

public class WebService1:localhost.WebService
{
    private static System.Net.CookieContainer cookieContainer;

    static WebService1()
    {
        cookieContainer = new System.Net.CookieContainer();
    }

    public WebService1()
    {
        this.CookieContainer = cookieContainer;
    }
}

调用的时候也不需要重新给CookieContainer赋值了:

protected void btnLogin_Click(object sender, EventArgs e)
{
    WebService1 ws = new WebService1();
    ws.Login(txtName.Text);
}
protected void btnGetName_Click(object sender, EventArgs e)
{
    WebService1 ws = new WebService1();
    lblName.Text = ws.GetName();
}

 

Tags: ,

技术生涯

Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft