1

WCF サービス "ProjB" は、同じソリューション内の別のプロジェクト "ProjA" で関数 "ProcRpt(string Date)" を呼び出す必要があります。その関数は、SSRS を扱うクラス「Common」にあります。その関数では、サブレポートのパスを追加する必要があります。Wcf サービス側

Common cmn = new Common();
cmn.ProcRpt(t);

一般的な ProcRpt():

viewerF.ProcessingMode = ProcessingMode.Local;
viewerF.LocalReport.ReportPath = System.Web.Hosting.HostingEnvironment.MapPath("~\\RDLC\\rptSub.rdlc");
viewerF.LocalReport.DataSources.Add(LoadDataSource(shfDeptID, StatementDate, "f"));

問題は wcf の実行です。サブレポートのパスは wcf フォルダーを指し、ProjA のパスではなく ProjB のパスを指します。元のパス「ProjA/RDLC/rptSub.rdlc」にするにはどうすればよいですか。ありがとう

4

1 に答える 1

0

これで猫の皮を剥く方法は約1000通りあります。これが発生する理由は、それがプログラム/サービス/ウェブサイトが実行されている実際のパスであるためです。そのため、相対パスを使用すると、アプリケーションが現在実行されているパスのサブフォルダーが作成されます。 .

最初に試すことができるのは、実行しようとしていることに対応するために相対パスを変更することです。いくつかのドット (..) を使用すると、現在の場所からフォルダーを上に移動できるようになります。

"..\\ProjA\\RDLC\\rptSub.rdlc"

これはおそらくこれを行う最も「正しい」方法です。絶対パスを使用することもできますが、Web アプリケーションとサービスの両方で、そうするとセキュリティ上の影響があります (リート ハクサーがファイル システムについて何かを知っている可能性があるため、彼/彼女が移動方法を理解した場合、これは悪いことです)。サーバーのディレクトリの周り。

最後に、バイナリを bin フォルダーに移動して、これらのサブレポートへの相対パスを設定できます (作業は増えますが、よりクリーンになります)。最終ビルドでそれらすべて (バイナリ ファイル) を 1 か所にまとめることは、世界の終わりではなく、長期的には同様の問題を軽減する可能性があります。

于 2013-01-04T16:08:25.417 に答える