WCF .svc文件有返回类型,客户端代码看到所有无效

时间:2016-08-08 04:47:43

标签: c# wcf

截图将真正澄清很多事情。基本上,我有这个服务并使用WCF测试客户端我可以得到一个字符串。但是,我使用Visual Studio创建的客户端引用表示我的方法返回为void。

我的Test()方法中的ServerConnection对象引用了Visual Studio创建的服务引用变量。

Root.svc.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace chatService_SignalRService.Services
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Root" in code, svc and config file together.
    // NOTE: In order to launch WCF Test Client for testing this service, please select Root.svc or Root.svc.cs at the Solution Explorer and start debugging.
    public class Root : IRoot
    {
        public String DoWork()
        {
            return "Hello Bailey!";
        }
    }
}

IRoot.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace chatService_SignalRService.Services
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IRoot" in both code and config file together.
    [ServiceContract]
    public interface IRoot
    {
        [OperationContract]
        String DoWork();
    }
}

我正在使用Portable Class库。我选择该类库,添加服务引用,将地址指向我的Web服务器,并将其命名为ServerCT。

然后在我的可移植类库下的Profile.cs中,我创建了一个对象和方法。

using Microsoft.AspNet.SignalR.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Classes
{
    public class Profile : User
    {

        public static ServerCT.RootClient ServerConnection = new ServerCT.RootClient();


        public void Test()
        {
            ServerConnection.DoWorkAsync();
        }
    }
}

截图: enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

生成的异步方法总是无效的,因为它们是异步的并且不返回任何结果。相反,您应该使用Completed事件来处理结果:

ServerConnection.DoWorkCompleted += (sender, args) => 
{
    Console.WriteLine($"DoWork result: {args.Result}");
};
ServerConnection.DoWorkAsync(); // void, the result is provided through event handler

如果要进行同步调用并同步获取结果,则应该像这样调用同步方法DoWork

ServerConnection.DoWork(); // returns string

请注意,不会为某些类型的项目或\和配置生成同步操作。例如,对于Silverlight应用程序。