WCF不会返回int

我正在C#中构建一个WCF,并且客户端同时使用它。 由于某种原因,我无法获得返回int的方法。 这是我的合同:

[ServiceContract] public interface IMData { [OperationContract] int ReturnAnInt(); [OperationContract] String HelloWorld(); } 

这是我实现它的地方:

 public class MData : IMData { public String HelloWorld() { return "Hello World"; } public int ReturnAnInt() { return 5; } } 

我正在使用Visual Studio,而对于客户端,我将此WCF导入为Web引用。 现在由于某种原因,当我声明一个MData实例并尝试调用HelloWorld时,没有问题,但是在调用ReturnAnInt时出现编译错误。

 MData m = new MData(); String helloWorld = m.HelloWorld(); int result = m.ReturnAnInt(); 

我使用ReturnAnInt得到的错误是:“方法没有重载’ReturnAnInt’需要0个参数”所以然后我鼠标hover以查看Visual Studio期望的内容,并且它说该方法应该如下所示:

 void MData.ReturnAnInt(out int ReturnAnIntResult, out bool ReturnAnIntResultSpecified) 

我已经在这上面撞墙几个小时了,在谷歌上找不到任何东西,而且我的同事也感到困惑。 为什么要添加两个不在定义中的参数,并更改返回类型? 任何帮助将不胜感激。 如果我遗漏任何有用的信息,我会道歉。

您可以将其作为服务参考(更新的技术)而不是Web参考(旧技术)导入吗? 我通过服务引用使用WCF服务并且没有看到这样的问题 – 当服务定义允许没有int时,我只看到一个Specified属性(并且作为int旁边的属性,而不是两个para参数)指定(根据我的经验,WCF生成的服务定义按预期工作)。

如果你找不到更好的解决方案,这里有一个使用部分类的解决方法:( struct返回struct时都必须这样做,而不仅仅是int s)

 public partial class MData { public int ReturnAnInt() { int result; bool specified; this.ReturnAnInt(out result, out specified); if (!specified) throw new InvalidOperationException(); return result; } } 

更新 http://www.codeproject.com/Articles/323097/WCF-ASMX-Interoperability-Removing-the-Annoying-xx有一个(有点笨拙)的解决方案,并通知我们根本原因是WCF产生了不良(可以说是不准确)WSDL – 它们对真正不需要它的元素有一个minOccurs="0" 。 Web引用按原样读取,并生成笨重的代码来处理它,这是您正在尝试处理的内容。 基于他的文章,您可以返回此类型而不是int

 [MessageContract(IsWrapped = false)] public class MyInt { [MessageBodyMember] public int Result { get; set; } public static implicit operator MyInt(int i) { return new MyInt { Result = i }; } public static implicit operator int(MyInt m) { return m.Result; } } 

随着修改方法的返回类型:

 [ServiceContract] public interface IMData { [OperationContract] MyInt ReturnAnInt(); [OperationContract] String HelloWorld(); } public class Service1 : IMData { public MyInt ReturnAnInt() { return 4; } public string HelloWorld() { return "Hello World"; } } 

您可以将其作为服务引用(使用名称空间MData )导入,而不是Web引用。

并使用以下代码,

 MDataClient m = new MDataClient(); String helloWorld = m.HelloWorld(); int result = m.ReturnAnInt(); 

你的代码没有错。 如果您添加服务引用并使用上面的代码段,它应该可以正常工作。

我有一个类似的问题,我无法得到我的Web服务的out int参数工作。 我仍然不确定由于这是什么,但我使用string作为out参数。

 [OperationContract] LoginStatus GetLogin(string username, string password, out string s_uId); 

在Web服务方面:

 s_uId = uId.ToString(); 

在客户端:

 int uId; string s_uId; result = client.GetLogin(username, password, out s_uId); Int32.TryParse(s_uId, out uId);