1

私はWCFを研究していて、ASMX Webサービスソリューション(複数のプロジェクト)を見つけた「ベストプラクティス」に従ってゆっくりとリファクタリングしており、一時停止してアドバイスを求める必要があると感じる設計/アーキテクチャの問題に遭遇しました。 。

概要: ASP.Net MVCと「ルート」を使用しないWCFサービスでHttpContextを使用するにはどうすればよいですか?

詳細: この書き直しの主な目標はパフォーマンスの向上であり、NetTcpBindingがそのために最適であると読んだので、避ける必要があると思います。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

避ける必要があります:

serviceHostingEnvironment aspNetCompatibilityEnabled="true"

したがって、WCF用にリファクタリングされたWebサービスは、HttpContext、SessionなどのASP.NET依存関係を回避する必要があります。Sessionはまったく使用しませんが、現在、次のスニペットのように1つのWebメソッド(UploadFile)がHttpContextを使用しています。

[WebMethod(Description = "Upload a file with metadata properties packed in a delimited string")]
    public string UploadFile(string trimURL
                , byte[] incomingArray
                , string fileName
                , string RecordTypeName
                , string metaDataString)
    {
    string pathFileInfo; // declared here in a "bare block" so it is in scope for the finally block too
        try
        {
            pathFileInfo = ByteArrayToFile(fileName, incomingArray);
            FileInfo fi = new FileInfo(pathFileInfo);
            if (fi.Exists)
            {

ここでHttpContextが使用されます。

        public string ByteArrayToFile(string _FileName, byte[] _ByteArray)
    {
        string fullName = HttpContext.Current.Server.MapPath(@".\UploadWorkArea\") + _FileName;
        using (FileStream _FileStream = new FileStream(fullName
                    , FileMode.Create
                    , FileAccess.Write))
        {
            _FileStream.Write(_ByteArray, 0, _ByteArray.Length);
            _FileStream.Close();
            return fullName;
        }
    }

したがって、私はここでこのアドバイスを見つけました: http: //msdn.microsoft.com/en-us/library/aa702682.aspx

" AppDomain内では、HTTPランタイムによって実装される機能はASP.NETコンテンツに適用されますが、WCFには適用されません。ASP.NETアプリケーションプラットフォームのHTTP固有の機能の多くは、ASP.NETを含むAppDomain内でホストされるWCFサービスには適用されません。これらの機能の例には、次のものがあります。

  • HttpContext:WCFサービス内からアクセスする場合、Currentは常にnullです。代わりにRequestContextを使用してください。

そしてそのすぐ下:

これらの制限は、IISアプリケーションでホストされるWCFサービスにのみ適用されます。ASP.NETコンテンツの動作は、WCFの存在による影響を受けません。HTTPパイプラインによって従来提供されていた機能を必要とするWCFアプリケーションは、ホストである同等のWCFの使用を検討する必要があります。独立したトランスポート:

HttpContextの代わりにOperationContext。」

最後に、この名前空間を追加しました。

using System.Web.Routing;

..これでこの問題を解決するために:

public RequestContext(
HttpContextBase httpContext,
RouteData routeData

)。

そして、私はさらに進むことに非常に不安を感じているところに到達しました。ASP.NET MVCについて少し読んだことがありますが、これは「ルーティング」の使用ですが、実際にはありません。パフォーマンスのためにより高速なバインディングを使用できるように、これを再構築することを考えています。

うまくいけば、私の質問は明確であり、私はあなたがこれについて私にいくつかのアドバイスを与えるためにあまり多くのことをぶらぶらしていません。

4

2 に答える 2

1

試しHostingEnvironment.MapPath()ましたが、例外が発生しました。それでも、構成で機能するかどうかを確認するために試すことができます。HttpServerUtility.MapPath()また、ILSpyをチェックインしたところ、が呼び出されることがわかりましたが、WCFメソッド内でインスタンスHttpRequest.MapPath()を取得できるかどうかはわかりません。HttpRequest

他のすべてが失敗した場合は、HostingEnvironment.ApplicationPhysicalPathプロパティを使用してみてください。Server.MapPath()以下のコードを試してみたところ、 ASP.NETMVCアプリケーションで呼び出されたときと同じパスが返されました。

Path.GetFullPath(Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @".\UploadWorkArea\", _FileName));

の使用については、この質問を参照してくださいPath.GetFullPath

于 2011-11-04T02:04:30.373 に答える
1

wcfアプリケーションの動作パスを取得する方法の2番目の回答を参照してください。

string mappedPath = string.Format(@"{0}\UploadWorkArea\", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath);

私は何かを逃しましたか、それともあなたが必要とするのはそれだけですか?

于 2011-11-04T02:14:28.320 に答える