为什么WCF工作方式与ASMX不同?

3

我不确定自己做错了什么,但我有两个服务,一个是WCF,另一个是ASMX服务。

我正在尝试以与我的asmx版本相同的方式调用double数组。

这是两个服务的图片:

enter image description here

我已经找到了解决方法,可以调用该方法,但我想知道为什么ArrayOfDouble在我的serviceref2中没有像在我的serviceref1中那样显示?

这是WCF版本:

namespace WcfSum
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface SumListWCF
    {

        [OperationContract]
        string CalculateSum(List<double> listDouble);
    }
}

namespace WcfSum
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class SumList : SumListWCF
    {
        public string CalculateSum(List<double> listDouble)
        {
            return listDouble.Sum().ToString();
        }
    }
}

这是ASMX版本:
namespace CalculateWebServiceSum
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class SumList : System.Web.Services.WebService
    {
        [WebMethod]
        public string CalculateSum(List<double> listDouble)
        {
            return listDouble.Sum().ToString();

             //return listDouble.Select(n => (double)n).ToString();
        }
    }
}

上一篇文章在这里:WCF数组不成功地调用双倍

这提供了解决方案,但并没有解释为什么它不能以相同的方式运行。或者是否有一种方法让它表现得相同。这让我觉得我基本上缺少了某些东西?

编辑

顺便说一下,这些都在本地运行。


关于WCF服务,有一个不太好的秘密:它们非常麻烦,以至于我所知道的现实世界中没有人会选择使用它们。我们创建老式的ASMX,当我们在VS2010中添加服务引用时,我们转到Advanced->Add Web Reference,以便一切按照预期工作。 - Eric Z Beard
2
WCF服务与ASMX服务不同。你为什么会感到惊讶它们不同呢? - Stilgar
3
我认识很多人在“现实世界”中使用WCF,我不知道为什么会引起轩然大波,它们只是略有不同。我更喜欢WCF,因为它最有可能得到Microsoft的持续支持和改进。http://keithelder.net/2008/10/17/WCF-vs-ASMX-WebServices/ - Kekoa
这不可能是真的吧?我还尝试了高级选项来添加Web引用,但根本不按照我想要的方式工作。如果你可以直观地添加一个Web引用并添加你想要的方法,那就太好了。我确定我错在服务和操作合同方面。 - G Gr
@EricZBeard:这是你说的一个非常奇怪的陈述。就我而言,我有数十个正在日复一日地运行的生产WCF服务——除非有人拿枪指着我的头,否则我永远不会回到ASMX。 - marc_s
显示剩余2条评论
2个回答

4

SOAP或WSDL标准中没有规定如何序列化诸如List<double>之类的内容。ASMX在XML模式中似乎发明了一个complexType来表示double数组。

相比ASMX,WCF更好。当您使用"Add Service Reference"时,可以决定如何处理重复的元素,比如您的double数组。可以选择将它们作为数组、List<T>等进行处理。

限制WCF的功能与ASMX相似是没有价值的,因为ASMX是一项遗留技术。


0

你正在使用一个泛型 List<> 参数,这对于 asmx 和 wcf 不受支持,因为它需要与不支持泛型集合的语言进行互操作。还可以参见 这些 问题

问题 提到了一个生成的 ArrayOfInt,因此 ArrayOf* 类型名称可能是一种通用解决方案,用于处理泛型类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接