WCF不会返回int

Mad*_*owe 5 c# wcf

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

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

  [OperationContract]
  String HelloWorld();
}
Run Code Online (Sandbox Code Playgroud)

这是我实现它的地方:

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

  public int ReturnAnInt()
  {
    return 5;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

MData m = new MData();
String helloWorld = m.HelloWorld();
int result = m.ReturnAnInt();
Run Code Online (Sandbox Code Playgroud)

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

void MData.ReturnAnInt(out int ReturnAnIntResult, out bool ReturnAnIntResultSpecified)
Run Code Online (Sandbox Code Playgroud)

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

Tim*_* S. 4

您可以将其导入为服务参考(较新的技术)而不是 Web 参考(较旧的技术)吗?我通过服务引用使用 WCF 服务,但没有看到这样的问题 -Specified当服务定义允许指定 no 时(intWCF-根据我的经验,生成的服务定义已按预期工作)。outint

如果您找不到更好的解决方案,这里有一个使用部分类的解决方法:(这必须在您返回 a 时完成struct,而不仅仅是ints )

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

更新 http://www.codeproject.com/Articles/323097/WCF-ASMX-Interoperability-Removing-the-Annoying-xx有一个(有点笨拙)的解决方案,并告诉我们根本原因是WCF生成不良(可以说)不准确的)WSDL - 他们有一个minOccurs="0"真正不需要它的元素。Web References 按原样读取此内容,并生成笨拙的代码来处理它,这正是您要处理的内容。根据他的文章,您可以返回此类型而不是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

[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";
    }
}
Run Code Online (Sandbox Code Playgroud)