带有字符串返回值(或参数)的ASMX WebService,强制在WCF客户端中生成消息协定

时间:2014-11-06 19:56:04

标签: wcf asmx messagecontract

我有一个简单的ASMX WebService,它看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Web;
using System.Web.Services;
using System.Xml.Serialization;

namespace ContractGenerationTest
{
    [WebService(Namespace = Constants.WebServiceNamespace)]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Standard : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hellow World";
        }
    }
}

我还有一个与服务相关联的WCF客户端。 "始终生成消息合同"复选框未选中。 WCF客户端正在生成消息合同类,即使我不想这样做。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://sampleuri.org/ContractGenerationTest/", ConfigurationName="StandardService.StandardSoap")]
public interface StandardSoap {

    // CODEGEN: Generating message contract since element name HelloWorldResult from namespace http://sampleuri.org/ContractGenerationTest/ is not marked nillable
    [System.ServiceModel.OperationContractAttribute(Action="http://sampleuri.org/ContractGenerationTest/HelloWorld", ReplyAction="*")]
    ContractGenerationTestClient.StandardService.HelloWorldResponse HelloWorld(ContractGenerationTestClient.StandardService.HelloWorldRequest request);

    [System.ServiceModel.OperationContractAttribute(Action="http://sampleuri.org/ContractGenerationTest/HelloWorld", ReplyAction="*")]
    System.Threading.Tasks.Task<ContractGenerationTestClient.StandardService.HelloWorldResponse> HelloWorldAsync(ContractGenerationTestClient.StandardService.HelloWorldRequest request);
}

请注意CODEGEN评论。这似乎是以这种方式构造的,因为string类型在ASDLX服务的WSDL中没有标记为nillable。它没有标记为nillable(也没有maxOccurs = 1),因为string.Empty提供了默认值。

如果字符串是复杂类型的成员,我可以将它们标记为[XmlElement(IsNullable=true)],这样可以解决问题...但我不能在这里做,因为它们是函数的一部分定义

这有解决方案吗?有没有办法让我的ASMX在WSDL中标记字符串参数并将类型返回为nillable?或者有没有办法让我的WCF客户端停止生成消息合同,即使存在非可合并的参数类型(知道这将删除参数选项)?

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。看起来它是使用默认选中的DataContractSerializer的结果。在Visual Studio中提供的GUI中没有解决此问题。要手动配置,请在服务的客户端打开Reference.svcmap文件,并将<Serializer>Auto</Serializer>更改为<Serializer>XmlSerializer</Serializer>。 这导致VS停止生成消息合同。