我按照下面的定义公开了WCF端点,
<service name="MyApp.Server.Endpoint.Orange" behaviorConfiguration="MyTio.Server.Endpoint.OrangeBehavior">
<endpoint address="" binding="basicHttpBinding" contract="Host.Server.Contract.IMyAppApi" bindingNamespace="http://host.com/myapp">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
当我在.NET 3.5中添加“Service Refrence”时,我们在代理中获得了以下类,这非常好:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="GetMemberBillersRequest", Namespace="http://schemas.datacontract.org/2004/07/Contract.MemberBillers")]
[System.SerializableAttribute()]
public partial class GetMemberBillersRequest : WCFClient.MyRequest {
[System.Runtime.Serialization.OptionalFieldAttribute()]
private int ApplicationIdField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private int ProductIdField;
[System.Runtime.Serialization.DataMemberAttribute()]
public int ApplicationId {
get {
return this.ApplicationIdField;
}
set {
if ((this.ApplicationIdField.Equals(value) != true)) {
this.ApplicationIdField = value;
this.RaisePropertyChanged("ApplicationId");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public int ProductId {
get {
return this.ProductIdField;
}
set {
if ((this.ProductIdField.Equals(value) != true)) {
this.ProductIdField = value;
this.RaisePropertyChanged("ProductId");
}
}
}
}
问题是当您在.NET 2.0中添加对同一服务的引用时
您获得同一合同的以下代理:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/Contract.MemberBillers")]
public partial class GetMemberBillersRequest : MyRequest {
private int applicationIdField;
private bool applicationIdFieldSpecified;
private int productIdField;
private bool productIdFieldSpecified;
/// <remarks/>
public int ApplicationId {
get {
return this.applicationIdField;
}
set {
this.applicationIdField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool ApplicationIdSpecified {
get {
return this.applicationIdFieldSpecified;
}
set {
this.applicationIdFieldSpecified = value;
}
}
/// <remarks/>
public int ProductId {
get {
return this.productIdField;
}
set {
this.productIdField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool ProductIdSpecified {
get {
return this.productIdFieldSpecified;
}
set {
this.productIdFieldSpecified = value;
}
}
}
除了通过.NET 2.0生成的代理还有两个附加字段外,两者都是相同的:
productIdFieldSpecified和applicationIdFieldSpecified。这两个字段的问题是如果你没有手动将它们设置为true,它们的相应字段(ApplicationId,ProductId)将不会被序列化并传递给服务器!
有人可以向我解释这里发生了什么吗?
编辑:
我发现这只发生在int类型,而不是字符串! 这是此操作的数据合同
[DataContract]
public class GetMemberBillersRequest : MyRequest
{
[DataMember]
public int ApplicationId { get; set; }
[DataMember]
public int ProductId { get; set; }
}
答案 0 :(得分:3)
这是预期的行为,自.NET 1.0以来一直如此。您将看到对于模式中可选的任何基本类型 - 使用use =“optional”的属性或具有minOccurs =“0”的元素。
如果缺少属性或元素,则生成的属性不能设置为null。相反,在这种情况下,*指定字段设置为false。在确定是否存在“真实”字段之前,请检查该字段。
同样,如果要设置main属性,则必须将* specified属性设置为true,否则不会发送。
我相信你知道,但我正在为未来的读者添加这个:是的,现在有可空的类型。但是,随着WCF的出现,ASMX Web服务的开发速度大大减慢。从来没有为基本类型实现可空属性,这并不让我感到惊讶。
另外,请注意这一点:Microsoft: ASMX Web Services are a “Legacy Technology”。
答案 1 :(得分:1)
查看您的服务代码会很有帮助。我暂时没有使用Web服务引用,但我的猜测是,如果这些字段不是可选的,请在您的DataMemeber属性中添加IsRequired = True并重新生成代理。