web-dev-qa-db-ja.com

RESTful WCFサービスの「.svc」拡張子を削除する方法

私の知る限りでは、RESTful WCFのURLにはまだ「.svc」が含まれています。

たとえば、サービスインターフェースが

[OperationContract]
[WebGet(UriTemplate = "/Value/{value}")]
string GetDataStr(string value);

アクセスURIは " http://machinename/Service.svc/Value/2 "のようになります。私の理解では、REST利点の一部は、実装の詳細を隠すことができるということです。 " http:// machinename/Service/value/2 "のようなRESTful URIどのRESTfulフレームワークでも実装できますが、 " http://machinename/Service.svc/value/2 "は、その実装がWCFであることを示しています。

アクセスURIからこの「.svc」ホストを削除するにはどうすればよいですか?

51
Morgan Cheng

IIS 7では、このブログで説明されている rl Rewrite Module を使用できます post

IIS 6では、URLを書き換える http module を記述できます。

public class RestModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication app)
    {
        app.BeginRequest += delegate
        {
            HttpContext ctx = HttpContext.Current;
            string path = ctx.Request.AppRelativeCurrentExecutionFilePath;

            int i = path.IndexOf('/', 2);
            if (i > 0)
            {
                string svc = path.Substring(0, i) + ".svc";
                string rest = path.Substring(i, path.Length - i);
                ctx.RewritePath(svc, rest, ctx.Request.QueryString.ToString(), false);
            }
        };
    }
}

そして、ニース サードパーティのISAPIモジュールやワイルドカードマッピングを使用せずにIIS 6で拡張なしのURLを実現する方法があります。

30
Darin Dimitrov

私はこの投稿が少し古いことを知っていますが、.NET 4を使用している場合は、URLルーティング(MVCで導入されましたが、コアASP.NETに組み込まれています)の使用を検討する必要があります。

アプリの開始(global.asax)で、次のルート構成行を使用して、デフォルトルートをセットアップします。

RouteTable.Routes.Add(new ServiceRoute("mysvc", new WebServiceHostFactory(), typeof(MyServiceClass)));

この場合、URLは次のようになります。

http://servername/mysvc/value/2

HTH

47
Thiago Silva

IIS 7 Rewrite Moduleを使用するか、カスタムモジュールを使用する場合の詳細情報は次のとおりです。 http://www.west-wind.com/Weblog/posts/570695.aspx

4
Rick Strahl

物理的な.svcファイルを完全に削除する方法もあります。これはVirtualPathProviderで実行できます。

参照: http://social.msdn.Microsoft.com/Forums/en-US/wcf/thread/350f2cb6-febd-4978-ae65-f79735d412db

3
Jason Kresowaty

IIS6または7では、無料の書き換えフィルターである [〜#〜] iirf [〜#〜] を使用できます。これが私が使ったルールです:

# Iirf.ini
#

RewriteEngine ON
RewriteLog  c:\inetpub\iirfLogs\iirf-v2.0.services
RewriteLogLevel 3
StatusInquiry  ON  RemoteOk
CondSubstringBackrefFlag *
MaxMatchCount 10

# remove the .svc tag from external URLs
RewriteRule  ^/services/([^/]+)(?<!\.svc)/(.*)$    /services/$1.svc/$2  [L]
2
Cheeso

その簡単なIIS 7- RL Rewrite Module)を使用する

IIS 6私は ISAPI Rewrite module を使用するのが最も簡単であることがわかりました。これにより、リクエストのURLを.svcファイルにマップする一連の正規表現を定義できます。 。

2
Eran Kampf

これをあなたのglobal.asaxに追加してください

private void Application_BeginRequest(object sender, EventArgs e)
{
    Context.RewritePath(System.Text.RegularExpressions.Regex.Replace(
               Request.Path, "/rest/(.*)/", "/$1.svc/"));
}

これにより、/ rest/Service1/arg1/arg2が/Service1.svc/arg1/arg2に置き換えられます。

1
Kenneth