gpt4 book ai didi

c# - WCF 不会返回 int

转载 作者:太空狗 更新时间:2023-10-29 23:09:09 24 4
gpt4 key购买 nike

我正在用 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 上什么也找不到,这也让我的同事感到困惑。为什么要添加两个定义中没有的输出参数,并更改返回类型?任何帮助将不胜感激。如果我遗漏了任何有用的信息,我深表歉意。

最佳答案

您能否将其导入为服务引用(较新的技术)而不是 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";
}
}

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com