WCF客户端无法在某些计算机上连接

本文关键字:计算机 连接 客户端 WCF | 更新日期: 2023-09-27 18:04:17

我有一个简单的自主机WCF服务。我在远程服务器上运行此服务。我能够与在我的机器上运行的客户端进行通信以提供服务(我是本地管理员(。但当我在不同的机器上运行同一个客户端(非管理员(时,它们无法通信。

我监控了资源管理器,每次服务调用和回调时,我都会看到两个随机的本地端口打开。所以我无法打开特定的端口。

知道其他机器上防火墙配置更改的可能原因是什么吗?

我是WCF的新手。如果这是一个基本问题,请原谅我。

WCF服务器代码

namespace CService
    {
    class Program
       {
       static void Main(string[] args) {
        Console.Title = "C Service";
        // Step 1 of the address configuration procedure: Create a URI to serve as the base address.
        Uri baseAddress = new Uri("http://" + GetServerIPPort.ServerIP + ":" + GetServerIPPort.Port + "/CService/Service");

        // Step 2 of the hosting procedure: Create ServiceHost
        ServiceHost selfHost = new ServiceHost(typeof(CSerice), baseAddress);
        try
        {
            // Step 3 of the hosting procedure: Add a service endpoint.
            selfHost.AddServiceEndpoint(typeof(ICService), new BasicHttpBinding(), "CService");
            // Step 4 of the hosting procedure: Enable metadata exchange.
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            selfHost.Description.Behaviors.Add(smb);
            // Step 5 of the hosting procedure: Start (and then stop) the service.
            selfHost.Open();
            Console.WriteLine("The Coemet Service is ready and its listening on {0}", baseAddress.AbsoluteUri.ToString() + ":" + baseAddress.Port.ToString());
            Console.WriteLine("Press <ENTER> to terminate service.");
            Console.WriteLine();
            Console.ReadLine();
            // Close the ServiceHostBase to shutdown the service.
            selfHost.Close();
        }
        catch (CommunicationException ce)
        {
            Console.WriteLine("An exception occurred: {0}", ce.ToString());
            selfHost.Abort();
        }
    }
}

我已经在这个链接的帮助下生成了Proxy对象http://msdn.microsoft.com/en-us/library/ms733133(v=vs.110(.aspx

我的客户端代码片段如下所示。

string serviceEndPointAddress = "http://" + GetServerIPPort.ServerIP + ":" +     GetServerIPPort.Port + "/CService/Service/CService";
            var remoteAddress = new System.ServiceModel.EndpointAddress(new Uri(serviceEndPointAddress));
            object rawOutput;
            using (var client = new CServiceClient(new BasicHttpBinding(), remoteAddress))
            {
                client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 0, 0, 100);
                try
                {
                    rawOutput = client.GetData(Identifier, field, date);
                }
                catch (Exception e)
                {
                    errorMsg = e.ToString();
                }
            }'n

在"client.GetData(标识符、字段、日期("上清除错误

系统。运行时。序列化。InvalidDataContractException:键入"系统"。线程。任务。任务1[System.Object]' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for other supported types. at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message, Type type) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.XsdDataContractExporter.GetSchemaTypeName(Type type) at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.CreatePartInfo(MessagePartDescription part, OperationFormatStyle style, DataContractSerializerOperationBehavior serializerFactory) at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.CreateMessageInfo(DataContractFormatAttribute dataContractFormatAttribute, MessageDescription messageDescription, DataContractSerializerOperationBehavior serializerFactory) at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter..ctor(OperationDescription description, DataContractFormatAttribute dataContractFormatAttribute, DataContractSerializerOperationBehavior serializerFactory) at System.ServiceModel.Description.DataContractSerializerOperationBehavior.GetFormatter(OperationDescription operation, Boolean& formatRequest, Boolean& formatReply, Boolean isProxy) at System.ServiceModel.Description.DataContractSerializerOperationBehavior.System.ServiceModel.Description.IOperationBehavior.ApplyClientBehavior(OperationDescription description, ClientOperation proxy) at System.ServiceModel.Description.DispatcherBuilder.BindOperations(ContractDescription contract, ClientRuntime proxy, DispatchRuntime dispatch) at System.ServiceModel.Description.DispatcherBuilder.BuildProxyBehavior(ServiceEndpoint serviceEndpoint, BindingParameterCollection& parameters) at System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory(ServiceEndpoint serviceEndpoint, Boolean useActiveAutoClose) at System.ServiceModel.ChannelFactory.CreateFactory() at System.ServiceModel.ChannelFactory.OnOpening() at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.ChannelFactory.EnsureOpened() at System.ServiceModel.ChannelFactory 1.CreateChannel(EndpointAddress地址,Uri通过(在系统中。ServiceModel。ClientBase 1.CreateChannel() at System.ServiceModel.ClientBase 1.CreateChannelInternal((在系统中。ServiceModel。ClientBase`1.get_Channel((在CServiceClient。GetData(字符串标识符,字符串字段,日期时间日期(

WCF客户端无法在某些计算机上连接

In。NET 4.5中,WCF中对基于任务的异步操作提供了新的支持。当您使用VS 2012或更高版本在开发机器上生成代理时,默认情况下可以包括这些代理。

现在,您正在使用的新机器可能正在运行。NET 4.0,因此不知道该如何处理基于任务的异步操作,因此出现了异常。

这是一个非常简单的修复程序,可以支持客户端运行。NET 4.0中,您只需要在服务参考设置中执行以下任一操作:

  1. 取消选中"允许生成异步操作">
  2. 选择"生成异步操作"而不是"生成基于任务的操作">

特别感谢这篇博文。

根据异常,您正在传递一个不可序列化的对象。我怀疑这是以下代码行中的标识符:

rawOutput = client.GetData(Identifier, field, date);

根据堆栈跟踪,CService需要两个字符串和一个日期时间:

系统。ServiceModel。位于的ClientBase`1.get_Channel((CServiceClient。GetData(字符串标识符,字符串字段,日期时间日期(

如果需要使用WCF传递自定义对象(数据传输对象(,则应该为类使用DataContractAttribute属性,为每个成员使用DataMemberAttribute属性,如下所示:

[DataContract]
public class Identifier
{
    [DataMember]
    public string Id {get;set;}
}

我也面临着同样的问题,当我在framework 4.5更高版本上创建WCF服务并试图在IIS 8(即应用池4.0(上部署时,上述步骤并没有解决我的问题,所以我在framework 4.0中从头开始重新创建了我的完整解决方案并重新部署了它,按照上面的步骤取消选中"允许生成异步操作"解决了我的问题。