我正在用C#构建WCF,并且有一个客户端要同时使用它。由于某种原因,我在获取返回int的方法时遇到了麻烦。这是我的契约(Contract):

[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个参数”
因此,然后我将鼠标悬停在上面,以查看Visual Studio期望什么,并说该方法应如下所示:
void MData.ReturnAnInt(out int ReturnAnIntResult, out bool ReturnAnIntResultSpecified)

几个小时以来,我一直在用头撞墙,在Google上什么也找不到,而且我的同事也感到困惑。为什么要添加定义中未包含的两个out参数,并更改返回类型?任何帮助将不胜感激。如果遗漏任何有帮助的信息,我深表歉意。

最佳答案

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

如果找不到更好的解决方案,这是使用partial classes的一种解决方法:(这必须在您返回struct而不是int的任何时间完成)

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";
    }
}

关于c# - WCF将不返回int,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12964759/

10-17 02:11