【问题标题】:WCF will not return an intWCF 不会返回 int
【发布时间】:2012-10-18 22:30:44
【问题描述】:

我正在用 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 个参数” 然后我将鼠标悬停在 Visual Studio 的预期上,它说该方法应该如下所示:

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

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

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

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

    如果您找不到更好的解决方案,这里有一个使用partial classes 的解决方法:(这必须在您返回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;
        }
    }
    

    更新 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;
        }
    }
    

    连同修改方法的返回类型:

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

    【讨论】:

    • WCF 真的支持out 参数吗?
    • 是的,但这并不是问题所在。问题中描述的问题是 WCF C# 代码没有指定 out 参数或可选的 ints,但这是 Web 引用代码生成器创建它的方式。这行得通。但是,您可以定义像 int ReturnAnInt(out int otherInt); 这样的 WCF 服务,它可以工作,并且可以作为服务引用和 Web 引用进行访问。生成的 WSDL 只是一个包含多个元素的响应对象,因此它也应该生成可用于其他客户端语言的内容。
    • 谢谢大家的回答,他们很有帮助!我将它作为服务参考导入,我的问题得到了解决:)
    【解决方案2】:

    您将其导入为服务参考(使用名称空间MData)而不是 Web 参考。

    并使用下面的代码,

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

    您的代码没有任何问题。如果您添加服务参考并使用上面的 sn-p,它应该可以正常工作。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,我的 Web 服务的 out int 参数无法正常工作。由于这到底是什么,我仍然不确定,但我使用string 作为out 参数让它工作。

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

      在网络服务端:

      s_uId = uId.ToString();
      

      在客户端:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-14
        • 2015-11-18
        • 2017-01-18
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 2023-04-03
        • 2013-05-15
        相关资源
        最近更新 更多