我正在用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/