サーバー (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 でこれをホストし、ブレークポイント ヒットを処理するようにしようとしています。