最近在琢磨WCF Rest模型,想配合Linq to Sql开放一些接口给我的Android客户端调用,但是在写的时候突然发现一个问题,自带的 ResponseFormat =

WebMessageFormat.Json不能序列化Linq to Sql生成的实体类,好了,放图

 

设置生成实体可被序列化


以下是我服务的代码:

 [ServiceContract(Namespace = "DAG.Business.IServices.IUserService")]
public interface IUserService
{
[OperationContract(Name = "DAG.Business.IServices.IUserService.GetUserList")]
[WebGet(UriTemplate = "UserService/GetUserList", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
d_user GetUserList();
}


具体实现:

 /// <summary>
/// 获取用户列表信息
/// </summary>
/// <returns></returns>
public d_user GetUserList()
{

d_user us = new d_user();
us.d_account_id = 1;
us.d_user_address="测试地址";

return us;
}

 

就是很普通的返回了d_user这个对象,好了,接下来我们打开IE,请求地址:http://localhost:2683/UserService.svc/UserService/GetUserList 访问这个服务,我用

HttpWatch来监控一下,抛出以下异常:

 

 

ERROR_HTTP_INVALID_SERVER_RESPONSE


随后我自己自定义了一个实体类,访问成功,数据正常被解析.......



posted @ 2012-01-05 16:13 GaryChen 阅读(399) 评论(0) 编辑

用google chrome很久了,浏览速度很快,就是一些支持不怎么好,比如没有像Firefox一样的IE TAB,在淘宝购物的时候我们需要切换IE,下载的时候不能使用迅雷,要用

 

chrome默认的下载工具,不过,这一切现在都可以实现了,那就是SunChrome的出现,其实在界面上跟Google Chrome根本没什么不同,唯一的亮点就是可以随时随地的

 

切换IE核心,这一点给我们chrome迷带来很大的好处,下面给大家展示一下SunChrome的扩展功能

 

在地址栏右边有个chrome的小按钮..点一下就切换到IE核心了,是不是很方便啊?哈哈

 

chrome11|yupoo.com

 

 

chrome12|yupoo.com

 

还有就是对下载工具的一个支持,快车,迅雷都可以用了,无须进行设置,跟IE下一样使用就可以了...再也不用chrome自带的下载器

了..真好,哈哈

 

chrome1|yupoo.com

 

还有许多非常优秀的插件,大家可以去sunchrome的论坛下载 http://www.lovechrome.com/

 

本文地址:http://garychen.net/?p=87

我的技术博客:http://www.garychen.net/

posted @ 2010-04-08 01:03 GaryChen 阅读(2809) 评论(22) 编辑

 

最近在做项目的时候,发现同一个数据契约再客户端隶属于两个不同的命名空间,为此如果两个服务进行交互的时候会涉及到类型 的问题,互操作性很差,要进行不必要的拆和装,在前面终于让我找到了答案,下面我来描述一下这个场景,大家请看下面

 

[实体类]  大家请注意命名空间

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GaryChenWCFService
{
/// <summary>
/// 测试实体类
/// </summary>
public class Customer
{
public string Name
{
get;
set;
}

public string Sex
{
get;
set;
}
}
}

 

 

下面是1号服务  注意:返回的是GaryChenWCFService.Customer类型的对象


 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GaryChenWCFService.ServiceClasses
{
public class OneCustomerService :ServiceContracts.IOneCustomer
{

#region IOneCustomer 成员

public GaryChenWCFService.Customer GetCustomer()
{
//省略
}

#endregion

 

 

 

下面是2号服务  注意:添加的是GaryChenWCFService.Customer类型的对象


 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GaryChenWCFService.ServiceClasses
{

public class TwoCustomerService : ServiceContracts.ITwoCustomer
{

#region ITwoCustomer 成员

public void AddCustomer( GaryChenWCFService.Customer cs )
{
//省略
}

#endregion
}

}

 

 

 宿主部分我们省略...我们来看客户端,问题来了


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GaryChenClient
{
class Program
{
static void Main( string[] args )
{
OneCustomerService_Proxy.OneCustomerClient OneService_Proxy
= new GaryChenClient.OneCustomerService_Proxy.OneCustomerClient();
TwoCustomerService_Proxy.TwoCustomerClient TwoService_Proxy
= new GaryChenClient.TwoCustomerService_Proxy.TwoCustomerClient();

OneCustomerService_Proxy.Customer cu
= OneService_Proxy.GetCustomer();
TwoService_Proxy.AddCustomer(cu);
}
}
}

 

 

1号服务取得的Customer属于OneCustomerService命名空间,现在我要把这个取得出来的对象放入2号服务去进行处理,

 

这就出现了同一个数据契约两个不同的命名空间问题,大家看一下对象浏览器两个代理所生成的东西,

 

two|yupoo.com

 

One|yupoo.com

 

这样一来我们如果要放进2号服务去操作的话必须显示声明TwoCustomerService_Proxy.Customer进行转换,这样的场景

或许大家都经常碰到,下面我说一下解决办法,

 

按照WCF编程第二版中的说法,我把原话给大家发一下

 

在Visual Studio 2008添加一个服务引用时,你必须为每个服务引用提供唯一的新命名空间。导入的类型会定义在这个新的命名空间中。如果为共享了相同数据契约的两个不同服务添加引用,就会出现问题,因为你得到了两个不同的类型,在两个不同的命名空间,表示的却是相同的数据契约。然而,默认情况下,如果被客户端引用的任意一个程序集包含的数据契约,与已经暴露在引用服务元数据的数据契约类型匹配,Visual Studio 2008就不会再次导入。需要再次强调的是,已有的数据契约引用必须是在另一个引用程序集中,而不是在客户端项目自身。这一限制会在未来的Visual Studio版本中提供,而目前最方便的弥补措施与最佳实践则为:将所有共享的数据契约分解到指定的类库中,并让所有的客户端引用该程序集。然后,通过服务引用的高级设置对话框(参见图1-10),可以控制和配置引用程序集(如果存在)与有关的共享数据契约进行协调。“Reuse types in referenced assemblies”检查框默认是被选中的,但如果你需要也可以关闭这一功能。顾名思义,你只能共享数据契约,却不能共享服务契约。使用里面的单选按钮,可以让Visual Studio 2008跨所有的引用程序集重用数据契约,或者通过选择列表项限制对特定程序集的共享。



s这段话的意思就是让你把我服务端的DLL引用到客户端来,在服务配置中来共享同一个数据契约,见下图

 

im|yupoo.com

 

大家看见没有,需要指定服务引用的程序集,这样才不会存在命名空间类型的问题,这样做我知道非常不合理,但是如果客户端自

己开发的话而不是其他平台调用的话这样也是没有办法中的办法,期待WCF下一个版本可以改进这一点!!

 

文章到此结束,如有不对,请大家指出,谢谢

 

我的博客:www.garychen.net

本文地址:http://garychen.net/?p=73

posted @ 2010-04-06 20:16 GaryChen 阅读(824) 评论(6) 编辑

之前发现服务暴露给客户端的数据契约的命名空间问题,在于多个服务交互的时候非常不方便,本人也跟Frank Xu Lei还有一些

朋友讨论过这个问题,一直没有好的解决办法.下面我描述一下问题,我有一个服务端项目,命名空间就叫做WCFProject吧...下面

有一个类叫做Customer,标注了数据契约,以此暴露给客户端, 我的UserService服务中有个方法叫做GetUserInfo来获取

Customer的信息,在我客户端通过引用添加服务的时候生成了一个UserService的服务代理 Service_Proxy,在服务端项目这个

Customer实体类的命名空间WCFProject.Customer,而在客户端的时候这个实体类又变成 了UserService.Customer,这时候假

设我又有一个服务需要把这个拿出来的Customer实体类当做他方法的参数进行处理的时候就出现了一个二义性问题,假设这个

服务的名字为Role_Proxy,那么它下面的一个方法需要一个Customer类型的参数进行处理,但是这个这个Customer又属于Role

服务自己命名空间下的,这样就对操作带来了不变,我需要从User服务拿出来的Customer转换成Role服务下面那个Customer的

类型才可以传入进去处理,客户端开发人员往往抱怨我为什么会这样,我也寻找了许多解决的办法,要么把服务端的这个

WCFProject程序集引用进来,要么进行土办法的拆装,之前一直是拆装的方式,不仅浪费了性能,而且有造成了多余的代码量,添加

引用程序集的方式我觉得客户端是我们自己开发还好,如果有一天其他平台需要访问我们服务的时候我们不可能也提供这个程

序集给它吧?这是完全不符合规范的,不知道看了我文章的大牛们有没什么好的解决办法?


小弟文采不好,请各位见谅!!

本文地址:http://garychen.net/?p=56

我的博客:www.garychen.net


posted @ 2010-04-02 17:16 GaryChen 阅读(1229) 评论(18) 编辑

最近在写服务端方法的时候突然发现过多的操作契约会导致客户端添加引用查找服务

地址

出现引用出错,具体的异常截图我不提供出来了,因为本人不具备做服务分解设计的能力,

以操作契约多达50+,每个method我都是这样写的

[OperationContract] //操作契约

[FaultContract(typeof(Exception))] //错误契约

MetHodName();

 

解决办法:

只需要把错误契约全都去掉就不会出错了…还有一个就是操作契约数量最好控制在66个以

下(多于20个就不规范了,哎…不会设计,没办法),超过66个就算错误契约全都去掉都会出

引用错误.

 

文章到此结束,希望大牛能解释一下原由,欢迎拍砖赐教

文章地址:http://garychen.net/?p=47

转载请写明出处,谢谢!

posted @ 2010-03-30 16:39 GaryChen 阅读(1118) 评论(9) 编辑
摘要: 最近在用entity framework 和 WCF结合做服务端,偶然发现一个问题,就是数据传输对象(DTO)的容量问题,我的项目方案是把数据访问层封装为WCF部署在外网服务器上供客户端调用.我发现传输速度没有想象的那么好,简直就是不堪入目,终于有一天我发现问题的所在,就是edmx生成的实体类和自己手写实体类的区别,我用District这张表来做演示,表中一共有5个字段,废话不多说,先看一代码,下...阅读全文
posted @ 2010-02-06 13:01 GaryChen 阅读(721) 评论(5) 编辑
摘要: 显示风格...太华丽了..风格2Mac OS的滑动效果..太暴力了另外一种显示风格..嘛是起飞???好友搜索阅读全文
posted @ 2009-12-22 09:28 GaryChen 阅读(296) 评论(2) 编辑