在我的WCF服务中,我有'int'参数的方法:
[OperationContract]
PublishResult PublishEnrollmentProfile(
string siteName, int methodId,...
);
当我创建对此WCF服务的WebService引用时,生成了以下签名:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("...",
RequestNamespace="...", ResponseNamespace="...",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public PublishResult PublishEnrollmentProfile(
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
string siteName,
int methodId,
[System.Xml.Serialization.XmlIgnoreAttribute()]
bool methodIdSpecified, ...)
{
object[] results = this.Invoke("PublishEnrollmentProfile", new object[] {
siteName,
deployServerName,
methodId,
methodIdSpecified,
deviceClass,
deviceName,
registrationCode});
return ((PublishResult)(results[0]));
}
你可以看到,而不是一个整数参数我得到2:整数(对于值)和bool(对于标记'如果指定了值)。
这可以吗?为什么我需要第二个参数(bool)?
非常感谢!
答案 0 :(得分:3)
指定的“字段仅在结构的可选参数上生成。(int,datetime,decimal等)。所有这些变量都将使用名称Specified生成其他变量。
由于“Specified”字段仅在可选参数上生成,如果将PublishEnrollmentProfile方法的参数放在DataContract中并将methodID上的DataMember属性设置为[DataMember(IsRequired = true)],则指定的字段应该去离开,除非这是一个可选字段,在这种情况下你想要保留原样。
这是一个带有一些样本的blog posting。
更新
所以你有了合同。
[OperationContract]
PublishResult PublishEnrollmentProfile(string siteName, int methodId,...);
如果该方法的参数不是可选的,那么您应该创建一个DataContract并重新定义OperationContract,如下所示:
{
[OperationContract]
PublishResult PublishEnrollmentProfile(PublishEnrollmentProfileRequest request);
}
然后你有这样的DataContract。
[DataContract]
public class PublishEnrollmentProfileRequest
{
private string _siteName;
[DataMember]
public string siteName
{
get;
set;
}
private int _methodId;
[DataMember(IsRequired=True)]
public int methodId
{
get;
set;
}
.
.
.
}
因此,您有一个“请求”对象,您将其传递到具有siteName和methodId字段的WCF服务。在我提供的示例中,现在需要methodId,这将消除“指定”字段。