سؤال

أريد الحصول على مجلد العمل لتطبيق WCF. كيف يمكنني الحصول عليه؟

إذا حاولت

HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)

أحصل على استثناء مرجعي فارغ (كائن http.current هو فارغ).


ما قصدته مع مجلد العمل كان المجلد حيث تعمل خدمة WCF الخاصة بي. إذا قمت بتعيين aspNetCompatibilityEnabled="true", ، أحصل على هذا الخطأ:

الخادم لم يقدم ردا مجددا؛ قد يكون سبب هذا عدم تطابق العقد، وإغلاق الجلسة المبكرة أو خطأ في الخادم الداخلي.

هل كانت مفيدة؟

المحلول

كنت بحاجة إلى نفس المعلومات لتطبيق WCF المستضيف IIS6 ووجدت أن هذا يعمل بالنسبة لي:

string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

كما هو الحال دائما، YMMV.

نصائح أخرى

يرجى الاطلاع على إجابة asgle أدناه. إنه أفضل بكثير من هذا واحد.

تحديث بعد مزيد من المعلومات

ما يلي عملت بالنسبة لي. اختبرتها مع خدمة WCF جديدة استضافتها على IIS من خلال Service1.svc.

  1. يضيف <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> إلى تكوين الويب. <system.serviceModel>..</ ..> موجودة بالفعل.
  2. يضيف AspNetCompatibilityRequirementsAttribute إلى الخدمة مع الوضع المسموح به.
  3. يستخدم HttpContext.Current.Server.MapPath("."); للحصول على الدليل الجذر.

أدناه هو الكود الكامل لفئة الخدمة. لم أكن تغييرات في واجهة iService1.

[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{
    public void DoWork()
    {
        HttpContext.Current.Server.MapPath(".");
    }
}

وتحت مقتطف من Web.config.

<system.serviceModel>
    <!-- Added only the one line below -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

    <!-- Everything else was left intact -->
    <behaviors>
        <!-- ... -->
    </behaviors>
    <services>
        <!-- ... -->
    </services>
</system.serviceModel>

الإجابة القديمة

ماذا تقصد بمجلد العمل؟ يمكن استضافة خدمات WCF بعدة طرق مختلفة ومع نقاط نهاية مختلفة حتى يكون مجلد العمل غامضا بعض الشيء.

يمكنك استرداد "مجلد العمل" العادي مع مكالمة directory.getCurrentDirectory ().

HttpContext هو كائن ASP.NET. حتى إذا كان يمكن استضافة WCF على IIS، فهذا لا يزال غير ASP.NET ولهذا السبب لا تعمل معظم تقنيات ASP.NET بشكل افتراضي. OperationContext هو ما يعادل WCF ل HttpContext. يحتوي تشغيل العملية على معلومات حول الطلب الوارد، والاستجابة الصادرة من بين أشياء أخرى.

على الرغم من أن أسهل طريقة قد تكون لتشغيل الخدمة في وضع توافق ASP.NET. عن طريق تبديله في Web.config. هذا يجب أن يمنحك الوصول إلى httpcontext asp.net. سوف يقتصدك على * httpbindings واستضافة IIS. لتبديل وضع التوافق، أضف ما يلي إلى Web.config.

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

اعتمادا على ما تريد. عادة ما أرغب في حل عنوان URL مثل "~ / ملف / ملف". هذا هو ما عمل.

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");

أكثر عمومية، أنا أستخدم هذا واحد

AppDomain.CurrentDomain.BaseDirectory

يجب أن تحل the AspnetCompatibilityEnabled = "True" مشكلتي، لكنني حصلت على هذا الخطأ:

الخادم لم يقدم ردا مجددا؛ قد يكون سبب هذا عدم تطابق العقد، وإغلاق الجلسة المبكرة أو خطأ في الخادم الداخلي.

لقد قمت بحل مشكلتي في الحصول على المسار الفعلي لخدمة WCF قيد التشغيل عن طريق الحصول عليه من مجال التطبيق الحالي الخاص بي:

AppDomain.CurrentDomain.BaseDirectory

من أجل المرجع أيضا ميزات ASP.NET مثل كائن HttpContext، تحتاج إلى تشغيل تطبيق WCF الخاص بك في وضع توافق ASP.NET. هذه شرط يشرح كيفية القيام بذلك.

استخدم HostingenVironment.ApplicationphysicalPath في WCF للعثور على المسار المادي للتطبيق الخاص بك. استخدام مساحة الاسم باستخدام system.web.hosting؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top