2

サーバー (IIS でホストされている) 上にあり、特定の URL でサーバーにヒットする HTTP GET 要求をリッスンする WCF サービスを作成する必要があります。

具体的には、有効な GET リクエストがサーバーに到達したときに、URL にエンコードされたパラメーターを検査したいと考えています。

以下は私のインターフェースのコードです:

[ServiceContract]
public interface IHttpHandler
{
    [OperationContract(Action = "*", ReplyAction = "*")]
    void HandleMessage(Message m);

    [OperationContract]
    [WebInvoke(UriTemplate = "HandleEchoRequest", Method = "GET")]
    string HandleEchoRequest(Stream request);
}

実装コード (svc.cs ファイル):

public void HandleMessage(Message m)
{
    //do some work
}

public string HandleEchoRequest(Stream request)
{
    //...do something here
    return "asdf";
}

SVC を正常にヒットできます。

http://localhost/HttpMessageProcessor/HttpHandler.svc

ただし、W3WP プロセスにアタッチすると、ブレークポイント セットにステップ インできないようです。最終的には HTTPS を使用したいと思います。

WCF サービス プロジェクトの web.config ファイル:

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

クライアントの App.config:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IHttpHandler" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost/HttpMessageProcessor/HttpHandler.svc"
        behaviorConfiguration="webBehavior" binding="webHttpBinding"
        contract="Proxy.IHttpHandler" name="BasicHttpBinding_IHttpHandler" />
    </client>
  </system.serviceModel>

クライアントコード:

using (var service = new Proxy.HttpHandlerClient())
{
}

Console.ReadKey();

コードにステップインできるかどうかを確認するために、次の 2 つのことを試しました。 1.CTRL+F5コンソール プロジェクトをクリックしてクライアントを起動し、W3WP プロセスにアタッチできるかどうかを確認します。2. クライアントをデバッグ モードで実行し、次のような URL を参照できるかどうかを確認します。

http://localhost/HttpMessageProcessor/HttpHandler.svc/HandleEchoRequest/

上記の方法はどれも機能していないようです。

私はすでに提案を求めてネットを見回しており、いくつかのことを試しましたが、ここで言及したコードに基づいています。どんな提案やアイデアも歓迎します!

編集私はこのウェブサイト に出くわし、次のように簡単なソリューションを実装しました。ブラウザーに次の URL を入力すると、HandleMessage の実​​装で設定されたブレークポイントに正常に到達できます。

http://localhost/TestWCFSite/TestWCFService.svc/HandleMessage

コード:

 [ServiceContract]
 public interface IService1
 {
     [OperationContract(Action = "*", ReplyAction = "*")]
     void HandleMessage(Message m);
 }

 public class Service1 : IService1
 {
     public void HandleMessage(Message m)
     {
        //do something here.
     }
 }

サービスの App.config:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

私のクライアントコード:

Uri baseAddress = new Uri("http://localhost/TestWCFSite/TestWCFService.svc/");
Uri endpointAddress = new Uri("http://localhost/TestWCFSite/TestWCFService.svc/HandleMessage/");
var binding = new CustomBinding(new TextMessageEncodingBindingElement(MessageVersion.None, Encoding.UTF8), new HttpTransportBindingElement());
ServiceHost service = new ServiceHost(typeof(Service1), baseAddress);
service.AddServiceEndpoint(typeof(IService1), binding, endpointAddress);
service.Open();

var message = string.Format("Service open at {0} - press a key to continue", baseAddress);

Console.WriteLine(message);
Console.ReadKey();
service.Close();

私の問題は、IIS でこれをホストし、ブレークポイント ヒットを処理するようにしようとしています。

4

1 に答える 1