2

サービス スタック 3.9.21 の使用。IIS 7.5 でアプリをホストします。統合された 4.0.30319 ASP.NET アプリ プールを使用します。

説明のために、次のパスがあるとします (DTO と対応する要求ハンドラーによってサポートされています)。

/cars/{id}

一部の車の ID には、URL エンコードする必要があると思われる文字が含まれています。パイプ、| はその 1 つです。たとえば、ID が「1|2」の車を取得するリクエストを送信すると、次のスタック トレースで古き良き 500 が返されます。

[ArgumentException]: Illegal characters in path.
   at System.IO.Path.CheckInvalidPathChars(String path)
   at System.IO.Path.GetFileName(String path)
   at ServiceStack.MiniProfiler.UI.MiniProfilerHandler.MatchesRequest(IHttpRequest request) in C:\src\ServiceStack\src\ServiceStack\MiniProfiler\UI\MiniProfilerHandler.cs:line 24
   at ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated) in C:\src\ServiceStack\src\ServiceStack\WebHost.Endpoints\ServiceStackHttpHandlerFactory.cs:line 153
   at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

パス内のパイプを URL エンコードするかどうかに関係なく、これを取得します。どうすればこの問題を解決できますか?

詳細

DTO

using ServiceStack.ServiceHost;

namespace SSUEB
{
    [Route("/cars/{id}", "GET")]
    public class ById
    {
        public string Id { get; set; }
    }
}

終点

using System.Collections.Generic;
using System.Net;
using ServiceStack.Common.Web;
using Stack = ServiceStack.ServiceInterface;

namespace SSUEB
{
    public class Cars : Stack.Service
    {
        public object Get(ById byId)
        {
            return new HttpResult(new Dictionary<string, string> {{"id", byId.Id}}, HttpStatusCode.OK);
        }
    }
}

アプリ

using ServiceStack.WebHost.Endpoints;

namespace SSUEB
{
    public class SSUEB : AppHostBase
    {
        public SSUEB() : base("ServiceStack toy service", typeof(SSUEB).Assembly)
        {
        }

        public override void Configure(Funq.Container container)
        {
            ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;
            SetConfig(new EndpointHostConfig { DebugMode = true });
        }
    }
}

リクエスト

これです:

curl -v -X GET -H "Accept: application/json" http://localhost:80/dealership/cars/123%20456

予想される 200 応答を取得します。

{"id":"123 456"}

しかし、これは:

curl -v -X GET -H "Accept: application/json" http://localhost:80/dealership/cars/123%7C456

最初に報告された問題が発生します。

IIS 要求ログは、%7C がパイプとしてデコードされ、%20 がデコードされることを示しています (ログでは、少なくともプラスとして)。後者は 200 (OK) 応答、前者は 500 (Internal Server Error) という結果になります。

2012-12-03 22:21:20 127.0.0.1 GET /dealership/cars/123|456 - 80 - 127.0.0.1 curl/7.27.0 500 0 0 5
2012-12-03 22:21:25 127.0.0.1 GET /dealership/cars/123+456 - 80 - 127.0.0.1 curl/7.27.0 200 0 0 1
4

1 に答える 1

1

私はこれを見てきましたが、これを許可するために ServiceStack でできることは何もありません。これは、ASP.NET によって生成された事前検証済みの例外です。IIS /ASP.NET で無効な文字を許可する方法に関するScott Hanselman の投稿を参照してください。

注: ASP.NET を経由しないため、このHttpListener 統合テストからわかるように、ServiceStack のセルフホストで許可されます。

于 2012-12-23T09:01:03.597 に答える