webservice今日遇到的二个问题:DataTable + Namespace

简介: 自从ms推出wcf以后,几乎没在web项目中用过webservice了,基本上都是以wcf host在iis中替代的。今天利用公司以前的web框架做一个新项目,里面大量使用了asmx,在开发过程中遇到了二个很少见的问题,记录如此,可能会帮助到遇到类似问题的同学们: 一、在WebService中避...
自从ms推出wcf以后,几乎没在web项目中用过webservice了,基本上都是以wcf host在iis中替代的。今天利用公司以前的web框架做一个新项目,里面大量使用了asmx,在开发过程中遇到了二个很少见的问题,记录如此,可能会帮助到遇到类似问题的同学们:
一、在WebService中避免用DataTable做为参数类型,强烈推荐用DataSet来替换DataTable,否则会死得很惨
场景如下:
一个解决方案分三层:一层是Model,一层是WebService,一层是WebSite
WebService层中提供基本的查询方法,但是调用方法时,必须提供登录后的验证票据信息.
Model层中定义了验证票据Ticket类
WebSite调用WebService层
结构图如下:
img_94f1a67c08e1fdfbe31f099bc106807b.png
Model层中的Ticket类如下:
namespace Model
{
    public class Ticket
    {
        public int UserID { set; get; }
        public string UserName { set; get; }
        public string Role { set; get; }

        public Ticket()         
        {
            this.UserID = -1;
            this.UserName = "";
            this.Role = "";
        }
    }
}
WebService中的MyService.cs如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Web.Services;
using Model;

/// <summary>
/// Summary description for MyService
/// </summary>
[WebService(Namespace = "http://yjmyzz.cnblogs.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class MyService : System.Web.Services.WebService
{

    public MyService()
    {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod(Description = "根据用户验证票据获取指定信息")]
    public int Query(ref DataTable dt, ref Ticket t)
    {

        //string sql = "select * from Table where id =" + t.UserID;
        //根据验证票据查询相关信息,如果有数据,将放到参数dt中

        return 1;//假定成功且有数据返回1,失败返回-1,成功但无数据返回0
    }

}
WebSite中的调用代码如下:
using System;
using System.Data;
using YJM;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        MyService ws = new MyService();
        //这里简化起见,直接生成一个票据
        Ticket t = new Ticket() { Role = "普通会员", UserID = 1, UserName = "杨俊明" };
        DataTable dt = new DataTable("myTableName");
        ws.Query(ref dt, ref t);
    }
}
然后好玩的事情发生了,Website层中的Ticket实例,在传递到WebServie层中时,信息丢失了,变成了null ,有图有真相:
调用前的截图
img_76624c6d4356a7b8ea8c2cc018d6af5b.png
 进入WebService层的截图:
img_98e35335c88264b01da47070ef4e9594.png
这个问题在编译期是发现不了的,只能运行后,才能知道,比较隐蔽。将DataTable换成DataSet类型后解决,以前只知道DataTable在做为参数类型在WebService中可能会遇到无法正常序列化的问题,但是今天遇到的问题还是第一回。

后记:如果把WebService(.asmx),换成WCF(.svc)后,居然这个问题就不存在了!又给"强烈推荐用WCF替换WebService"找到了一个借口。

以上问题的重现见示例源代码:http://files.cnblogs.com/yjmyzz/WS_DataTable.7z

二、如果多个WebService中使用了同一种自定义类型(比如Model层中的Ticket),多个WebService中的NameSpace必须统一
比如,在WebService层中又创建了一个MyService2,但是忘记了把NameSpace修改成跟MyService一样,如下图:
img_205d867e4bf36ba93b2682ad67b3a5f7.png
那么在Website层中,引用这个新服务后,将出现二个Ticket的定义,尽管它们的结构完全相同,如下图:
img_b8a9e42639f8c8e3adcfc54732e84095.png
当然,这里提到的这二个问题不算bug,只是使用webservice中需要注意的问题。 
 
目录
相关文章
|
4月前
|
Kubernetes Nacos 数据中心
k8s(9)Namespace(命名空间)
Namespace(命名空间)
101 0
|
8月前
|
算法 C语言 C++
【C++技能树】NameSpace --命名空间的使用
我在这段代码中想使用rand这个变量名字.这是正常的行为.
64 0
|
10月前
|
C++
【C++知识点】namespace命名空间的使用
【C++知识点】namespace命名空间的使用
66 0
|
10月前
|
存储 小程序 编译器
C++之命名空间(namespace)
C++之命名空间(namespace)
120 0
|
10月前
|
编译器 C++
using namespace std 是什么意思——C++命名空间
using namespace std 是什么意思——C++命名空间
214 0
|
11月前
|
C语言 C++
详解C++中的命名空间(namespace)
详解C++中的命名空间(namespace)
219 0
|
Kubernetes 开发者 容器
K8S 集群 NaneSpace(命名空间)NameSpace 删除及学习总结 | 学习笔记
快速学习 K8S 集群 NaneSpace(命名空间)NameSpace 删除及学习总结
1693 0
K8S 集群 NaneSpace(命名空间)NameSpace 删除及学习总结 | 学习笔记
|
图形学
Unity 报错之 The type or namespace name 'UI' does not exist in the namespace 'UnityEngine'
关于Unity2017 升级到 Unity2019 两个问题。 The type or namespace name 'UI' does not exist in the namespace 'UnityEngine'
2581 0
Unity 报错之 The type or namespace name 'UI' does not exist in the namespace 'UnityEngine'
|
Java C# 开发者
Q#语言入门0 命名空间namespace
做为一门新语言,要理解他 我们尽量使用其他大众语言的概念和他类比。   Q#编写的程序以.qs结尾。 一个最简单的Q#程序也要包含命名空间namespace。 C#里也有namespace,而java里用的类似概念是package。
967 0

热门文章

最新文章