1

現在、.NET 3.5 と WSCF.blue を使用してコントラクト ファーストの WCF SOAP サービスを作成しています。これにより、Xsd ファイルを使用して交換される Xml ドキュメントを設計できます。

WSDL 2.0 が存在し、REST エンドポイントのコントラクトを設計できるようになり、.NET 4.5 で最初にコントラクトが適切にサポートされるようになったので、次の質問があります。

Visual Studio 2012 にアップグレードして、既存の Xsd セットを保持し、REST や SOAP エンドポイントを自動的に公開することはできますか?

Visual Studio 2012 にアップグレードして、既存の Xsd セットを保持し、Xml や Json ドキュメントを自動的に交換することはできますか?

4

1 に答える 1

0

これが私の解決策です:

少なくとも Visual Studio 2012 が必要です。

WCF サービス ライブラリ プロジェクトを作成します。

Xsd ファイルを含めて、データ コントラクト ラッパーを自動的に作成します。

ServiceContract とクラスを次のように記述します。

using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace RestSoapTest
{
    public class Service1 : IService1
    {
        public List<CompositeType> GetData(string paramA, string paramB)
        {
            List<CompositeType> output = new List<CompositeType>();

            output.Add(new CompositeType()
            {
                Key = paramA,
                Value = paramB,
            });
            output.Add(new CompositeType()
            {
                Key = paramA,
                Value = paramB,
            });
            output.Add(new CompositeType()
            {
                Key = paramA,
                Value = paramB,
            });

            return output;
        }

        public void PutData(string paramA, string paramB, List<CompositeType> data)
        {
            throw new NotImplementedException();
        }
    }

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebGet(UriTemplate = "GetData/{paramA}/{paramB}")]
        List<CompositeType> GetData(string paramA, string paramB);

        [OperationContract]
        [WebInvoke(UriTemplate = "PutData/{paramA}/{paramB}")]
        void PutData(string paramA, string paramB, List<CompositeType> data);
    }

    [DataContract]
    public class CompositeType
    {
        [DataMember]
        public string Key { get; set; }
        [DataMember]
        public string Value { get; set; }
    }
}

(DataContract を手動で記述するか、Xsd で制御します)

Web ホスト プロジェクトを追加し、WCF プロジェクトを参照して、この web.config ファイルを追加します。

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="standardRest" automaticFormatSelectionEnabled="true" defaultOutgoingResponseFormat="Json" helpEnabled="true"/>
      </webHttpEndpoint>
      <mexEndpoint>
        <standardEndpoint name="standardMex"/>
      </mexEndpoint>
    </standardEndpoints>
    <services>
      <service name="RestSoapTest.Service1">
        <endpoint name="rest" address="" kind="webHttpEndpoint" endpointConfiguration="standardRest" contract="RestSoapTest.IService1"/>
        <endpoint name="mex"  address="mex" kind="mexEndpoint" endpointConfiguration="standardMex" contract="RestSoapTest.IService1"/>
        <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="RestSoapTest.IService1"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment>
      <serviceActivations>
        <add relativeAddress="RestSoapTest.svc" service="RestSoapTest.Service1"/>
      </serviceActivations>
    </serviceHostingEnvironment>
  </system.serviceModel>
  <system.web>
    <compilation debug="true"/>
  </system.web>
</configuration>

これで、ブラウザで次のことができます。

/RestSoapTest.svc = SOAP エンドポイント/ヘルプ ページ

/RestSoapTest.svc?wsdl = SOAP メタデータ

/RestSoapTest.svc/help = 自動休憩ヘルプ ページ

/RestSoapTest.svc/url/to/method = REST アクションの実行

Get メソッドの場合は、WebGet を使用し、UriTemplate とメソッド プロトタイプのパラメーター数が一致していることを確認してください。そうしないと、エラーが発生します。

Put メソッドの場合は、WebInvoke を使用し、UriTemplate のパラメーター数が等しい (プロトタイプの数 + 1) ことを確認します。

これを行うと、マップされていない単一のパラメーターは、WCF フレームワークによって、HTTP ポストの要求本文を介して受信されると想定されます。

本体から複数のパラメーターを受け取る必要がある場合は、パラメーターの形式を Wrapped に設定する必要があります。デフォルトは Bare です。ラップされた auto は、parameterName/value プロパティで複数のパラメーターをラップします。

于 2014-05-19T10:54:12.603 に答える