我正在为医疗数据实施分布式处理系统。我有多个客户端和服务器。客户端拥有数据,并将请求发送到服务器进行处理。
我必须将两个值传输到服务器并返回一个列表。服务器实现定义为:
[ServiceContract]
public interface ServerInterface
{
[OperationContract]
List<Triangle> ServerFunction(Grid g, double isolevel);
}
public class ServerImpl : ServerInterface
{
public List<Triangle> ServerFunction(Grid g, double isolevel)
{/*Implementation*/}
}
网格类定义为:
[Serializable]
public class Grid
{
public Point3D[] p = new Point3D[8];
public Int32[] val = new Int32[8];
}
和Triangle类一样
[Serializable]
public class Triangle
{
public Point3D[] p = new Point3D[3];
}
我创建了客户端和服务器端实现,并且isolevel值传递正常,但网格没有正确传递。
服务器使用以下代码创建WCF服务:
Uri baseAddress = new Uri("http://localhost:6525/ServerObject");
using (ServiceHost host = new ServiceHost(typeof(ServerImpl), baseAddress))
{
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
host.Open();
Console.ReadKey();
}
调用服务器获取结果的代码部分是:
var myBinding = new BasicHttpBinding();
var myEndPoint = new EndpointAddress("http://localhost:6525/ServerObject");
var myChannelFactory=new ChannelFactory<ServerInterface>(myBinding,myEndPoint);
ServerInterface si=null;
si = myChannelFactory.CreateChannel();
List<Triangle> triList=si.ServerFunction(Grid g,double isoValue);
它永远不会返回三角形列表(总是返回null)。
此代码在转换为Distributed之前已经过测试,并且运行正常。
我正在使用WCF,我尝试将网格和三角形转换为字符串值并传递它们,但它的工作原理却很慢。算法本身花费了大量时间,因此不希望有额外的处理时间。有什么想法吗?
答案 0 :(得分:1)
我拿了你的代码并实现了下面的服务器代码:
var v = new List<Triangle>();
var t1 = new Triangle();
t1.p = new Point3D[3];
t1.p[0] = new Point3D(1,2,3);
t1.p[1] = new Point3D(2,2,3);
t1.p[2] = new Point3D(3,2,3);
v.Add(t1);
return v;
并且客户端很好地接收了三角形坐标。您是否验证过您的服务器实际上是否正确填充了阵列?下面是我的简单客户端代码。为了创建代理,我刚刚启动了服务器,并从客户端项目中添加了一个服务引用
http://localhost:6525/ServerObject?wsdl
-
var c = new ServerInterfaceClient();
var v=c.ServerFunction(new Grid(), 34.3);
foreach (var triangle in v)
{
Console.WriteLine("X:"+ triangle.p[0]._x);
Console.WriteLine("y:"+ triangle.p[0]._y);
Console.WriteLine("z:"+ triangle.p[0]._z);
}
抱歉,我没有更多帮助,但我会在服务器端和客户端添加一些登录信息,以尝试查看丢失对象的位置。你的wcf设置应该没有任何问题。
答案 1 :(得分:1)
您应该通过将[DataContract]
属性添加到要序列化的类来使用DataContractSerializer。然后将[DataMember]
属性添加到每个classe的成员中。所以你会有这样的事情:
[DataContract]
public class Grid
{
[DataMember]
public Point3D[] p = new Point3D[8];
[DataMember]
public Int32[] val = new Int32[8];
}
可在Microsoft网站here上找到更多信息。