7

セルフ ホステッド サービスを作成する最初の数回の試み。クエリ文字列を受け入れてテキストを返す何かを作成しようとしていますが、いくつかの問題があります。

  • すべてのドキュメントでは、エンドポイントが構成ファイルに見つからない場合、各ベース アドレスに対して自動的に作成されるエンドポイントについて説明しています。これは私には当てはまらないようです.「サービスにはアプリケーションエンドポイントがありません...」という例外が発生します。以下のようにベース エンドポイントを手動で指定すると、これが解決されるようです。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    namespace TestService
    {
        [ServiceContract]
        public interface IHelloWorldService
        {
           [OperationContract]
           string SayHello(string name);
        }
    
        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string name)
            {
               return string.Format("Hello, {0}", name);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                string baseaddr = "http://localhost:8080/HelloWorldService/";
                Uri baseAddress = new Uri(baseaddr);
    
                // Create the ServiceHost.
                using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
                {
                    // Enable metadata publishing.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                    host.Description.Behaviors.Add(smb);
    
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr);
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello");
    
                    //for some reason a default endpoint does not get created here
                    host.Open();
    
                    Console.WriteLine("The service is ready at {0}", baseAddress);
                    Console.WriteLine("Press <Enter> to stop the service.");
                    Console.ReadLine();
    
                    // Close the ServiceHost.
                    host.Close();
                }
             }
         }
    }
    
  • このように要求されたときに、SayHello(文字列名) の名前の値を返すように設定するにはどうすればよいでしょうか: localhost:8080/HelloWorldService/SayHello?name=kyle

走る前に歩こうとしているのに、這い回っているようにしか見えない...

4

3 に答える 3

10

デフォルトのエンドポイントが追加されないという質問について:

  • まず、これは WCF 4 の機能です。.NET 4 でのみ動作します。
  • 次に、構成で明示的なエンドポイントが定義されておらず、コードで自分でエンドポイントを追加していない場合にのみ、デフォルトのエンドポイントがサービス ホストに追加されます。これら 2 つのエンドポイントをコードに追加することで、ユーザーが担当し、WCF 4 ランタイムが構成をいじることがなくなります。

What's new in WCF 4 for developers の詳細については、この MSDN ライブラリの記事を参照してください。特に、デフォルト エンドポイントの使用方法を示しています。基本的には、サービスのベース アドレスを定義し、ServiceHost を開きます。それだけです。

string baseaddr = "http://localhost:8080/HelloWorldService/";
Uri baseAddress = new Uri(baseaddr);

// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
   //for some reason a default endpoint does not get created here
   host.Open();

   // here, you should now have one endpoint for each contract and binding
}

必要に応じて、デフォルトのエンドポイントをコードで明示的に追加することもできます。したがって、独自のエンドポイントを追加する必要があるが、システムの既定のエンドポイントを追加したい場合は、次を使用できます。

// define and add your own endpoints here

// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
   // add all the system default endpoints to your host
   host.AddDefaultEndpoints();

   //for some reason a default endpoint does not get created here
   host.Open();

   // here, you should now have your own endpoints, plus 
   // one endpoint for each contract and binding
}

私はまた、このブログ投稿が非常に啓発的であることに気づきました.Christopherのブログは、優れた非常に役立つWCF投稿でいっぱいです.

于 2010-05-11T05:26:55.133 に答える
3

書籍に関しては、私のお勧めは次のとおりです。WCF をすばやく起動して実行するために私が常にお勧めする本は、Michele Leroux Bustamante によるLearning WCFです。彼女は必要なすべてのトピックを、非常に理解しやすく親しみやすい方法でカバーしています。これにより、基本、中級トピック、セキュリティ、トランザクション制御など、高品質で便利な WCF サービスを作成するために知っておく必要があるすべてのことを学ぶことができます。

WCF を学ぶ

WCF のより高度なトピックと詳細については、Juval Lowy によるProgramming WCF Servicesで取り上げます。彼はすべての技術的な詳細とトピックに実際に飛び込み、WCF プログラミングの "バイブル" を提示します。

WCF サービスのプログラミング

于 2010-05-11T05:19:14.200 に答える
0

IIS が Web サービスをホストしている場合は、「Web サービスを作成しました」という分かりやすいページが表示されますが、他に問題はないと想定されます。Bustamente の Learning WCF book にあるように、いくつかの簡単な WCF チュートリアルを試してみることをお勧めします。

編集: これは、要求されたサービス呼び出しからクエリ文字列パラメーターを取得する 1 つの方法を示すMSDN ページです。良い例です。[WebGet]属性の使い方を示しています。それを使用したくない場合は、OperationContextを使用して着信要求の内部を取得することができます。

于 2010-05-11T01:46:34.543 に答える