2

アプリ内からセルフホストのWCFサービスを作成することを検討しています。Microsoftサイトhttp://msdn.microsoft.com/en-us/library/ms731758(v=vs.100).aspxの例に従おうとしていますが、問題が発生しています。

プログラムを実行すると、svcutil.exeを実行してクライアントクラスを生成できるというWebページに移動できます。または、チュートリアルでエラーが発生したと表示されるWCFテストクライアントに移動すると、

Service metadata may not be accessible. Make sure your service is running and exposing metadata.

svcutil.exeから、次のエラーが発生します。

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>svcutil http://localhost:
6525/hello
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Attempting to download metadata from 'http://localhost:6525/hello' using WS-Meta
data Exchange or DISCO.
Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata docu
ments did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assembl
ies. Verify that you passed all the metadata documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to
use the /dataContractOnly option.

以下は私のWCFアプリのコードです

public interface IHelloWorldService
        {
            [OperationContract]
            string SayHello(string firstName, string lastName);
        }

        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:6525/hello");

            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                host.Open();

                Console.WriteLine("The service is ready at: {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service");
                Console.ReadLine();
                host.Close();

            }
        }

        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string firstName, string lastName)
            {
                return string.Format("Hello {0} {1}", firstName, lastName);
            }
        }

あなたが提供できるどんな助けにも感謝します

4

3 に答える 3

5

一見、あなたの問題を理解するのは難しいですが、コードをテストしたところ、コードに何かが欠けていることがわかりました。コントラクトをクライアントに公開するのを忘れました。インターフェイスに [ServiceContract] 属性がありません。以下はあなたの問題を解決します。

[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    string SayHello(string firstName, string lastName);
}
于 2013-03-04T03:35:59.467 に答える
1

メタデータはここでは公開されていません。これには新しいエンドポイントを追加し、サービス構成で有効にする必要があります。以下を実行してください。

<service name="ConsoleApplication1.WCFService1" behaviorConfiguration="newBehaviour" >
        <endpoint address="mex"  binding="mexHttpBinding"
                  contract="IMetadataExchange" />

        <host>
            <baseAddresses>
                <add baseAddress="http://localhost:80/WCFService1" />
            </baseAddresses>
        </host>
<service>

そしてサービスの振る舞いで

<serviceBehaviors>
          <behavior name="newBehaviour">
            <serviceMetadata httpGetEnabled="true"/>
          </behavior>
</serviceBehaviors> 

これを試してみたところ、問題なくプロキシが生成されました。ご不明な点がございましたらお知らせください。

于 2013-03-04T10:07:34.997 に答える
1

まったく同じ問題がありました。app.configを編集した後、デザイナーがapp.configファイルの自動更新を停止したことが判明しました。からマークアップを投稿できますapp.configか?

于 2013-03-04T02:07:03.950 に答える