我正在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)
我一直在墙上敲打我的头几个小时,在谷歌上找不到任何东西,而且我的同事也感到困惑。为什么要添加两个不在定义中的参数,并更改返回类型?任何帮助将不胜感激。如果我遗漏任何有用的信息,我会道歉。
答案 0 :(得分:4)
您可以将其作为服务参考(较新的技术)而不是Web参考(旧技术)导入吗?我通过服务引用使用WCF服务并且没有看到这样的问题 - 我只看到Specified
属性(并且它是int
旁边的属性,而不是out
} params)当服务定义不允许指定int
时(根据我的经验,WCF生成的服务定义按预期工作)。
如果找不到更好的解决方案,可以使用partial classes进行解决方法:(每次返回struct
时都必须这样做,而不仅仅是int
s)
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";
}
}
答案 1 :(得分:2)
您可以将其作为服务引用(名称空间为MData
)而不是Web引用。
并使用以下代码,
MDataClient m = new MDataClient();
String helloWorld = m.HelloWorld();
int result = m.ReturnAnInt();
您的代码没有任何问题。如果您添加服务引用并使用上面的代码段,它应该可以正常工作。
答案 2 :(得分:0)
我遇到了类似的问题,我无法获得我的网络服务的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);