1

次のような単一の Web メソッドを持つ .NET 3.5 Web サービスがあります。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
using System;
using System.Collections.Generic;
using System.Web.Services;

namespace Webservice1
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class WebService1 : WebService
    {
        [WebMethod]
        public List<Model.Person> HelloWorld()
        {
            var person1 = new Model.Person { FirstName = "Champa", LastName = "Chameli", TimeSpan = new TimeSpan(12,10,9,8)};
            var person2 = new Model.Person { FirstName = "Shamu", LastName = "Ramu", TimeSpan = new TimeSpan(12,10,9,8) };
            var persons = new List<Model.Person> { person1, person2 };
            return persons;
        }
    }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
using System.Runtime.Serialization;
namespace Model
{
    [DataContract]
    public class Person
    {
        [DataMember]
        public string FirstName{ get; set; }
        [DataMember]
        public string LastName { get; set; }
        [DataMember]
        public System.TimeSpan TimeSpan { get; set; }
    }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Person クラスは共通の .NET 3.5 アセンブリで定義されます。このアセンブリは、サービス リファレンス (.NET 互換 Web リファレンスではない) を介して Web サービスを呼び出す .NET 3.5 アプリケーションでも (プロジェクト リファレンスとして) 利用できます。

問題は、サービス参照名前空間に、自動生成された独自の Person の実装が含まれていることです。そのため、プロキシ SOAP クライアントで使用可能な、自動生成された Service Reference メソッドには、次の署名があります。

public WebApplication1.WebServiceReference1.Person[] HelloWorld()

また、dataContractOnly オプションを指定して svcutil コマンドを使用しようとしましたが、エラーが発生しました

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\svcutil" http:///CrossfirePortalServices/Leasing/WebService1.asmx /o:"C:\temp\WebApplication1\WebApplication1\WebService1.cs" / s /tcv:Version35 /r:"c:\temp\WebApplication1\Model\bin\Debug\Model.dll" /language:C# /n:*,RPCommonClasses.Services.WebService1 /dataContractOnly

エラー: 「http:///CrossfirePortalServices/Leasing/WebService1.asmx」から読み取った入力は、他のオプションと矛盾しています。さらにヘルプが必要な場合は、「svcutil /?」と入力してください。

私は、Model ドメインのさまざまなタイプをリクエスト用に ServiceReference ドメインのさまざまなタイプに変換したり、その逆を応答用に変換したりするのではなく、フレームワーク全体で Model ドメインを使用できるソリューションを見つけたいと思っています。

また、IT 部門が反対しているため、asmx Web サービスを WCF に変更することはできません。このタスクを達成する方法について何か提案はありますか?

4

1 に答える 1

0

良いニュースと悪いニュースがあります。良いニュースは、それが可能であり、公式にサポートされていることです. 悪いニュースは、かなり複雑だということです。

Web 参照間でクラス ライブラリを共有する例については、この MSDN の記事を参照してください。同じことがシナリオにも当てはまります。

http://msdn.microsoft.com/en-us/library/Aa480505.aspx

于 2012-08-31T21:31:57.130 に答える