关于wcf传递自定义对象,急,在线等,解决马上结贴

enaking 2012-04-10 12:03:14
我刚开始做wcf,我看到网上的例子都是很简单的,我想能传递自己的类或结构我先把我的代码贴出来,希望高手帮我指导一下,

//服务的接口
[ServiceContract]
public interface IWcfService
{
//test
[OperationContract]
string GetData();
[OperationContract]
void Ret(out string str, out string str2);
//上面两个函数都能正常调用,但下面需要返回ErrInfo 的自定义对象,就不知道怎么操作了,
[OperationContract]
DataTable GetDataTable(string strSql, out ErrInfo errInfo);
[OperationContract]
ErrInfo GetDataTable();
}

// 使用下面示例中说明的数据约定将复合类型添加到服务操作。
[DataContract]
public class ErrInfo
{
private short SignErr;
private string StrErr;

public ErrInfo(short signErr, string strErr)
{
SignErr = signErr;
StrErr = strErr;
}

[DataMember]
public short signErr
{
get
{
return SignErr;
}
set
{
SignErr = value;
}
}
[DataMember]
public string strErr
{
get
{
return StrErr;
}
set
{
StrErr = value;
}
}


//函数的实现我就不贴了,没得问题,下面是客服端的接口
[ServiceContract]
public interface IWcfService
{
//[OperationContract]
//string GetData();
[OperationContract]
string GetDataB();
[OperationContract]
void Ret(out string str,out string str2);
//这里我不知道怎么写返回对象函数的接口
}

private void btnA_Click(object sender, EventArgs e)
{
string str, str2;
server.Ret(out str, out str2);//所以也没办法调用,希望高手指点
MessageBox.Show(str2);
}


...全文
528 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
enaking 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用server.Ret(out str, out str2);//所以也没办法调用,希望高手指点
什么叫所以没办法调用?


引用 1 楼 的回复:
WCF中不建议使用OUT REF等。这类意义是传的是引用地址。但是WCF的通信跨了进程。内存引用地址没有意义了。

推荐多用用,而不是不建议,因为这样可以解决多个返回值的问题。
对于OUT关键字,其实微软默认对有返回值的函数,都改造……
[/Quote]
关于out和ref我也是你这样理解的,我的问题是返回自定义的ErrInfo对象,就是服务器中的ErrInfo GetDataTable() 函数,不知道在客户端怎么去调用,主要在客户端的接口契约不知道怎么写,所以在后面也不知道怎么调用,

你应该和这段连起来看

[ServiceContract]
public interface IWcfService
{
//[OperationContract]
//string GetData();
[OperationContract]
string GetDataB();
[OperationContract]
void Ret(out string str,out string str2);
//这里我不知道怎么写返回对象函数的接口
}

private void btnA_Click(object sender, EventArgs e)
{
string str, str2;
server.Ret(out str, out str2);
//所以也没办法调用ErrInfo server.GetDataTable();,希望高手指点
MessageBox.Show(str2);
}


qldsrx 2012-04-10
  • 打赏
  • 举报
回复
引用
server.Ret(out str, out str2);//所以也没办法调用,希望高手指点

什么叫所以没办法调用?

[Quote=引用 1 楼 的回复:]
WCF中不建议使用OUT REF等。这类意义是传的是引用地址。但是WCF的通信跨了进程。内存引用地址没有意义了。
[/Quote]
推荐多用用,而不是不建议,因为这样可以解决多个返回值的问题。
对于OUT关键字,其实微软默认对有返回值的函数,都改造成了OUT关键字的Void函数了。而REF关键字也完全支持,没任何问题,只不过这时传入和传出的是2个不同的对象,非同一个对象引用。
enaking 2012-04-10
  • 打赏
  • 举报
回复
我也感觉是这样的,但象int和string是可以用out,ref,肯定他们也不是共享的一个内存地址,只是在服务器端传递罢了,这个wcf应该特别封装了,我现在最重要的是想知道怎么传递自定义类型
就是最后一个函数ErrInfo GetDataTable();如何能返回ErrInfo对象
gio301 2012-04-10
  • 打赏
  • 举报
回复
WCF中不建议使用OUT REF等。这类意义是传的是引用地址。但是WCF的通信跨了进程。内存引用地址没有意义了。
qldsrx 2012-04-10
  • 打赏
  • 举报
回复
我觉得你这里存在张冠李戴的现象,你贴出来的代码不能说明你实际项目里的代码接口,你可以:
一、整个有问题的项目打包上传查问题,有可能定义了,那里也定义了,结果用了另一个。
二、直接看我给的那个项目,那个获取客户端文件列表就是用的自定义对象传输的。
enaking 2012-04-10
  • 打赏
  • 举报
回复
我认为我其它都没有问题,因为返回一个DataTable都是可以的,关键我这个ErrInfo是自己定义的类,所以也对我这种方法持怀疑态度
enaking 2012-04-10
  • 打赏
  • 举报
回复
我在通过步调发现服务器的GetErr函数是被调用了的,就是传值不过来,errInfo .signErr的值是0,而errInfo .strErr的值是null
enaking 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
我没看到你的server是啥——“ErrInfo errInfo= server.GetErr();”
你这里凭空跑出一个server来,我只能认为你这类的server是对的,如果得不到任何内容,说明server有问题,但是你始终没给出客户端完整代码,另外我在你的另外一个帖子里给你例子了,你自己不看,完整的示例代码都有,自己下载了分析比较,你的server没写对。
[/Quote]


这是客户端关于server的一段代码

IWcfService server;
private void Form1_Load(object sender, EventArgs e)
{
server = ChannelFactory<IWcfService>.CreateChannel
(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:918/WcfService"));
}

qldsrx 2012-04-10
  • 打赏
  • 举报
回复
我没看到你的server是啥——“ErrInfo errInfo= server.GetErr();”
你这里凭空跑出一个server来,我只能认为你这类的server是对的,如果得不到任何内容,说明server有问题,但是你始终没给出客户端完整代码,另外我在你的另外一个帖子里给你例子了,你自己不看,完整的示例代码都有,自己下载了分析比较,你的server没写对。
enaking 2012-04-10
  • 打赏
  • 举报
回复
ErrInfo是我自己写的一个类
enaking 2012-04-10
  • 打赏
  • 举报
回复
各位大哥些,我是想返回自已定义的类型,我好急啊,
enaking 2012-04-10
  • 打赏
  • 举报
回复
为了让你们看得更清楚,我把代码改了一下:在客户端调用后,ErrInfo还是为空。
服务器契约:

[ServiceContract]
public interface IWcfService
{
[OperationContract]
ErrInfo GetErr();
}

// 使用下面示例中说明的数据约定将复合类型添加到服务操作。
[DataContract]
public class ErrInfo
{
private short SignErr;
private string StrErr;

public ErrInfo(short signErr, string strErr)
{
SignErr = signErr;
StrErr = strErr;
}

[DataMember]
public short signErr
{
get
{
return SignErr;
}
set
{
SignErr = value;
}
}
[DataMember]
public string strErr
{
get
{
return StrErr;
}
set
{
StrErr = value;
}
}


函数实现:


public ErrInfo GetErr()
{
return new ErrInfo(2, "1111");
}


客户端契约:

[ServiceContract]
public interface IWcfService
{
[OperationContract]
ErrInfo GetErr();
}

[DataContract]
public class ErrInfo
{
private short SignErr;
private string StrErr;

[DataMember]
public short signErr
{
get
{
return SignErr;
}
set
{
SignErr = value;
}
}
[DataMember]
public string strErr
{
get
{
return StrErr;
}
set
{
StrErr = value;
}
}
}


客户端调用函数

private void btnA_Click(object sender, EventArgs e)
{
ErrInfo errInfo= server.GetErr();
MessageBox.Show(errInfo .strErr);
}

ztenv 2012-04-10
  • 打赏
  • 举报
回复
1、可以使用返回值(定义返回值的类,包含DataTable及你这个要out ref的字段)
2、可以使用回调的方式把值回调给对方。
PaulyJiang 2012-04-10
  • 打赏
  • 举报
回复
推荐多用用,而不是不建议,因为这样可以解决多个返回值的问题。
对于OUT关键字,其实微软默认对有返回值的函数,都改造成了OUT关键字的Void函数了。而REF关键字也完全支持,没任何问题,只不过这时传入和传出的是2个不同的对象,非同一个对象引用。

~~~~~~~1234期待测试结果
qldsrx 2012-04-10
  • 打赏
  • 举报
回复
你这里就已经写好了,运行应该没问题,就是这么调用的。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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