9

प्रथम लोड करने में असमर्थ है, इस एक और सवाल करने के लिए यहाँ इतने पर संबंधित है:इकाई की रूपरेखा 6: निर्दिष्ट मेटाडाटा संसाधन

:

मैं पढ़ चुके हैं और के साथ अपने मुद्दे को डिबग अतः लेख & ब्लॉग का अनुसरण

MetadataException: Unable to load the specified metadata resource

और

http://blogs.teamb.com/craigstuntz/2010/08/13/38628/

लेकिन ... मैं अभी भी सिर्फ इस 'फिक्स'

मैं एक वेबएपीआई (2.1) है परे सवालों रही है, इसलिए मेरी वेबएपीआई में कनेक्शन स्ट्रिंग के रूप में तो यह है:

<connectionStrings> 
<add name="ProjectEntities" connectionString=" 
    metadata=res://*/ProjectModel.csdl| 
    res://*/ProjectModel.ssdl| 
    res://*/ProjectModel.msl;   
    provider=System.Data.SqlClient;   
    provider connection string=&quot;   
    data source=192.168.0.1;   
    initial catalog=Project;   
    persist security info=True;   
    user id=***;   
    password=***;   
    multipleactiveresultsets=True;   
    App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 

जब मैं अपने वेबएपीआई में एक DbSet पर ToList() फोन (छद्म कोड):

DbContext _DbContext = new ProjectEntities(); 
DbSet<TEntity> _dbSet = _DbContext.Set<TEntity>(); 
_dbSet.ToList(); 

यह बहुत अच्छा काम करता है!

जब मैं एक Windows सेवा के भीतर से ही कहते हैं, मैं निम्नलिखित त्रुटि मिलती है: Error

कनेक्शन स्ट्रिंग के लिए app.config प्रवेश बिल्कुल web.config रूप में ही है:

<connectionStrings> 
<add name="ProjectEntities" connectionString=" 
    metadata=res://*/ProjectModel.csdl| 
    res://*/ProjectModel.ssdl| 
    res://*/ProjectModel.msl;   
    provider=System.Data.SqlClient;   
    provider connection string=&quot;   
    data source=192.168.0.1;   
    initial catalog=Project;   
    persist security info=True;   
    user id=***;   
    password=***;   
    multipleactiveresultsets=True;   
    App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 

अब, ब्लॉग को संदर्भित करने के dll से पता चलता मैन्युअल रूप:

<connectionStrings> 
    <add name="ProjectEntities" connectionString=" 
     metadata=res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.csdl| 
     res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.ssdl| 
     res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.msl;   
     provider=System.Data.SqlClient;   
     provider connection string=&quot;   
     data source=192.168.250.125\sqlexpress;   
     initial catalog=Project;   
     persist security info=True;   
     user id=***;   
     password=***;   
     multipleactiveresultsets=True;   
     App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" /> 
    </connectionStrings> 
:

<connectionStrings> 
    <add name="ProjectEntities" connectionString=" 
     metadata=res://Project.Data.dll/ProjectModel.csdl| 
     res://Project.Data.dll/ProjectModel.ssdl| 
     res://Project.Data.dll/ProjectModel.msl;   
     provider=System.Data.SqlClient;   
     provider connection string=&quot;   
     data source=192.168.0.1;   
     initial catalog=Project;   
     persist security info=True;   
     user id=***;   
     password=***;   
     multipleactiveresultsets=True;   
     App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

यह काम नहीं करता/मुद्दा

एक ही रास्ता मैं इसे ठीक कर लिया है ठीक, पूरी तरह से योग्य नाम का उपयोग करने के लिए है

यह इस तरह क्यों काम करता है? यह एक वेब प्रोजेक्ट में क्यों काम करेगा, लेकिन विंडोज़ सेवा प्रोजेक्ट नहीं ?? मैंने हाल ही में ईएफ 5 से ईएफ 6 में बदल दिया है, और यह त्रुटि पॉप अप हो गई है - यह सब कोड ईएफ को अपग्रेड करने के लिए पहले काम करता था। क्या किसी के पास कोई अंतर्दृष्टि है कि क्यों और कैसे/अगर मैं अपने कनेक्शन स्ट्रिंग में डीएलएल नाम के लिए * का उपयोग कर सकता हूं?

मैंने सोचा कि यह जहां सेवा .exe चल रहा था की एक मुद्दा था और एक फ़ाइल स्थानीय रूप से कॉपी नहीं किया गया था, लेकिन नहीं, Project.Data.dll है और यह सही संस्करण है।

मैंने त्रुटि को खोजने और खोजने के लिए फ़्यूज़नलॉग का उपयोग किया, और कोई भाग्य नहीं है। मैं बहुत उलझन में हूँ।

+0

क्या आपकी विंडोज सेवा अलग-अलग प्रमाण-पत्रों के तहत चल रही है? क्या उनके पास एसक्यूएल सर्वर से कनेक्ट करने के लिए उचित अधिकार हैं? – cadsjo

+0

यह देखने के लिए कि यह कनेक्शन बनाम फ़ाइल के साथ कोई समस्या है या नहीं, यह देखने के लिए कोड में अपनी कनेक्शन स्ट्रिंग को पकाएं। – Shoe

उत्तर

5

ऐसा क्यों होता है?

आपके पास जो समस्या है, वह बाइनरी रोपण या डीएलएल हाई-जैकिंग हमले (read more) को रोकने के लिए अतिरिक्त सुरक्षा उपायों का परिणाम है, जो आपके एप्लिकेशन को विंडोज सेवा के रूप में चलाते हैं।

मुझे क्यों परवाह करना चाहिए?

जैसा कि आप शायद जानते हैं, प्रत्येक संदर्भित डीएलएल फ़ाइल को देखने के लिए एक विशिष्ट, well documented ऑर्डर है। आम तौर पर यह वर्तमान अनुप्रयोग निर्देशिका में डीएलएल खोजना शुरू कर देता है और फिर PATH फ़ोल्डर्स, जीएसी, आदि जैसे अधिक "सार्वजनिक" स्थानों पर जाता है

द्विआधारी रोपण का मुख्य विचार दुर्भावनापूर्ण DLL फ़ाइल को पहले से चेक किए गए फ़ोल्डर में लगाया जाना है कानूनी डीएलएल का फ़ोल्डर। इस तरह के दुर्भावनापूर्ण DLL को लोड करने से हमलावर को सिस्टम पर नियंत्रण प्राप्त करने की अनुमति मिल जाएगी।

आमतौर पर विंडोज़ सेवाओं को ऊंचे खाते (लोकल सिस्टम, लोकल सर्विस, नेटवर्क सेवा, आदि) के तहत चलाया जाता है, इसलिए विंडोज सेवाएं बाइनरी रोपण के हमलों के लिए अच्छे लक्ष्य हैं।

मैं क्या कर सकता हूं?

माइक्रोसॉफ्ट ने सुरक्षा जोखिम को कम करने के लिए अतिरिक्त सावधानी पूर्वक कदम उठाए हैं और इसके लिए एक अच्छा कारण है। लेकिन आप अपने मुद्दों के आसपास काम करने की कोशिश कर सकते हैं।

1) वर्तमान निर्देशिका आप

Windows सेवा प्रणाली फ़ोल्डर (आमतौर पर C:\Windows\System32 की तरह कुछ)

अच्छी खबर में शुरू होता है क्या उम्मीद कर रहे हैं कि यह तय करने के लिए बहुत आसान है नहीं है। आपको बस सेवाओं की स्टार्टअप पर वर्तमान निर्देशिका बदलनी है।

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 

फिल हाक से blog post देखें;

2) दस्तावेज़ पढ़ें thoroughtly

एफई documentation के अनुसार, वाइल्डकार्ड वर्ण विशेष अर्थ नहीं है और यह स्थानों पर जहां क्रम DLL फ़ाइलों के लिए दिखेगा सीमित करती है: अपने काम फ़ोल्डर सेट कर दिया जाता

If you specify a wildcard (*) for assemblyFullName, the Entity Framework runtime will search for resources in the following locations, in this order:

1) The calling assembly.

2) The referenced assemblies.

3) The assemblies in the bin directory of an application.

के रूप में सिस्टम फ़ोल्डर में और आप संदर्भ शायद वहां नहीं हैं, ईएफ गलत स्थानों को देख सकता है और संसाधनों वाले आपके असेंबली लोड नहीं हो सकते हैं।

3) पूरी तरह से योग्य विधानसभा नाम

हालांकि मैं इस बारे में पूरी तरह से यकीन नहीं है और परीक्षण नहीं किया है, लेकिन माइक्रोसॉफ्ट सिर्फ पूरी तरह से योग्य विधानसभा नाम प्रदान किए बिना DLL लोड करने के लिए विंडोज सेवाओं की अनुमति नहीं हो सकता है के साथ सुरक्षित रहें दुर्भावनापूर्ण DLL फ़ाइलों को इंजेक्शन देने के जोखिम को कम करने के लिए;

अपनी विंडोज सेवाओं को सुरक्षित करने पर अच्छा पढ़ें here (विशेष रूप से अध्याय 5)।

4) इसे डीबग करें!

ईएफ 6 ओपन सोर्स प्रोजेक्ट होता है। इसका मतलब है कि आप इसका पूरा स्रोत प्राप्त कर सकते हैं और इसे डीबग कर सकते हैं। आप कोडप्लेक्स here पर प्रोजेक्ट पा सकते हैं।

+0

हम्म के लिए कनेक्शन स्ट्रिंग में डीएलएल संस्करण की आवश्यकता है, मैं जल्द ही इसका परीक्षण कर रहा हूं, लेकिन ऐसा लगता है कि यह सही ढंग से प्रश्न का उत्तर देता है। मुझे नहीं पता कि बाउंटी अंक किसी और को क्यों दिए गए थे !!!! –

+0

@ स्टेवस्टोक मुझे बक्षीस अंक प्राप्त हुए, क्योंकि बक्षीस की कृपा अवधि समाप्त होने के बाद मेरा सबसे ज्यादा वोट दिया गया जवाब था। "यदि आप 7 दिनों के भीतर (और अनुग्रह अवधि) के भीतर अपना बक्षीस नहीं देते हैं, तो 2 के न्यूनतम स्कोर के साथ शुरू होने वाले बक्षीस के बाद बनाए गए उच्चतम वोट किए गए उत्तर को आधा बकाया राशि से सम्मानित किया जाएगा।" http://stackoverflow.com/help/bounty –

+0

मुझे अब यह दिखाई देता है, लेकिन दुख की बात यह है कि यह सबसे अच्छा जवाब नहीं है। –

2

परियोजनाओं को अलग-अलग पथ में डीएलएल कॉपी करें और फिर अपनी सेवा प्रोजेक्ट में इसका संदर्भ लें।

+0

क्या आप थोड़ा बेहतर समझा सकते हैं? मैं जो भी –

-1

bellow चरणों का पालन करें: edmx फ़ाइल पर

1.Write क्लिक करें और फिर संबंधित संस्था की के साथ खुला क्लिक करें।

2. एक्सएमएल संपादक का चयन करें और खोलें क्लिक करें।

3. .edmx xml फ़ाइल के शीर्ष से नीचे तक स्क्रॉल करें और किसी भी त्रुटि चिह्न की तलाश करें।

4. यदि आप त्रुटियों को ध्यान में रखते हैं तो उसे ठीक करें। 5. समाधान को पुनर्निर्माण करें और यदि कोई त्रुटि नहीं मिली तो बधाई :)

1

मुझे डर है कि मैं आपको मिली त्रुटि को पुन: उत्पन्न करने में सक्षम नहीं था, या जवाब देता हूं कि आपको metadata बदलने की आवश्यकता क्यों है।

उसने कहा, मैंने यह सीखा है कि, ईएफ कनेक्शन स्ट्रिंग के लिए, विंडोज सेवा को WebApi की तुलना में एक अलग provider connection string की आवश्यकता थी।

आपकी त्रुटि को पुन: पेश करने के लिए निम्नलिखित चरण हैं। केवल अंतर यह है कि मैं स्थानीय डीबी का उपयोग कर रहा हूं SQLExpress नहीं।

मेरे चरणों-से-पुनरुत्पादन का परिणाम कोड यहां गिटहब पर ऑनलाइन है: https://github.com/bigfont/EntityFrameworkWindowsServiceWebApi

वेब API प्रोजेक्ट बनाएं

  1. ASP.NET वेब एपीआई 2 खाली परियोजना (MyWebApi)
  2. NuGet साथ
  3. , Install-Package EntityFramework -ProjectName MyWebApi
  4. एक नया एडीओ जोड़े बनाएँ:

    यहाँ उन कदम हैं। नेट एंटिटी डेटा मॉडल जिसे MyProjectModel कहा जाता है।

  5. Entity1 नामक एक इकाई जोड़ें।
  6. मॉडल से डेटाबेस जेनरेट करें, इसे माइप्रोजेक्ट को कॉल करें और स्थानीय डीबी का उपयोग करें।
  7. भागो \ v11.0
  8. (localdb) पर db निर्माण स्क्रिप्ट जोड़ें एक नया WebAPI नियंत्रक एक Get विधि है कि डेटाबेस प्रश्नों के साथ ValuesController नाम दिया है।
  9. टेस्ट दृश्य स्टूडियो में चल रहा है और स्थानीय होस्ट पर जाकर: 123456/API/प्राप्त

देखें: https://msdn.microsoft.com/en-us/data/jj205424.aspx

बनाएं Windows सेवा परियोजना

  1. बनाएं Windows सेवा (MyWindowsService)
  2. NuGet का उपयोग करें, Install-Package EntityFramework -ProjectName MyWindowsService
  3. MyProjectMode नामक एक नया ADO.NET इकाई डेटा मॉडल जोड़ें एल।
  4. Entity1 नामक एक इकाई जोड़ें।
  5. स्थानीय डीबी का उपयोग करके, इसे MyService पर कॉल करके मॉडल से डेटाबेस जेनरेट करें।
  6. डीबी निर्माण स्क्रिप्ट को चलाएं (localdb) \ v11.0
  7. ऑनस्टार्ट विधि में कुछ कोड डेटाबेस से पूछताछ करें।
  8. NT AUTHORITY\SYSTEM को स्थानीय डीबी लॉगिन के रूप में और एक MyService डीबी उपयोगकर्ता के रूप में जोड़ें।

PowerShell स्थापना, स्टार्टअप, और स्थापना रद्द करें

Release> installutil .\MyWindowsService.exe 
Release> Start-Service MyService 
Release> installutil .\MyWindowsService.exe /u 

localdb कनेक्शन स्ट्रिंग Windows सेवा

में के लिए कनेक्शन स्ट्रिंग में:

  • , स्थापित करने शुरू करने, और फाइल करने के लिए लिख कर टेस्ट विंडोज सेवा, मैं (localdb)\v11.0 का उपयोग करने में सक्षम नहीं था। इसके बजाय, मुझे नामित पाइप का उपयोग करने की आवश्यकता थी। मुझे इस कमांड लाइन के साथ नामित पाइप मिला:

    > SqlLocalDB.exe info v11.0 
    
    Name:    v11.0 
    Version:   11.0.2100.60 
    Shared name: 
    Owner:    MY_COMPUTER\Shaun.Luttin 
    Auto-create:  Yes 
    State:    Running 
    Last start time: 2015-04-09 5:54:34 PM 
    Instance pipe name: np:\\.\pipe\LOCALDB#1010101\tsql\query 
    

    इंस्टेंस पाइप नाम का उपयोग करते हुए परिणामस्वरूप कनेक्शन स्ट्रिंग इस तरह दिखाई दे रही थी।

    <connectionStrings> 
        <add name="MyProjectModelContainer" 
         connectionString=" 
        metadata= 
        res://*/MyProjectModel.csdl| 
        res://*/MyProjectModel.ssdl| 
        res://*/MyProjectModel.msl; 
        provider=System.Data.SqlClient; 
        provider connection string=&quot; 
        data source=np:\\.\pipe\LOCALDB#4BCE6D95\tsql\query; 
        initial catalog=MyService; 
        Integrated Security=True; 
        MultipleActiveResultSets=True; 
        App=EntityFramework&quot;" 
         providerName="System.Data.EntityClient" /> 
        </connectionStrings> 
    

    WebAPI कनेक्शन स्ट्रिंग जबकि इस तरह देखा:

    <add name="MyProjectModelContainer" 
         connectionString=" 
        metadata= 
        res://*/MyProjectModel.csdl| 
        res://*/MyProjectModel.ssdl| 
        res://*/MyProjectModel.msl; 
        provider=System.Data.SqlClient; 
        provider connection string=&quot; 
        data source=(localdb)\v11.0; 
        initial catalog=MyProject; 
        integrated security=True; 
        MultipleActiveResultSets=True; 
        App=EntityFramework&quot;" 
         providerName="System.Data.EntityClient" /> 
        </connectionStrings> 
    

    यह भी देखें: http://www.connectionstrings.com/sql-server-2012/

    Windows सेवा है कि हम एक WebAPI परियोजना के साथ क्या के साथ एक अलग कनेक्शन स्ट्रिंग का उपयोग करने की जरूरत है आपको जो मिला वह एक समान समस्या है। एसक्यूएल सर्वर प्रबंधन स्टूडियो से, विजुअल स्टूडियो और वेबएपी से, हम डेटा स्रोत (localdb) \ v.11 को कॉल करके कनेक्ट कर सकते हैं जबकि वेब सेवा से हमें इसे पाइप नामक इंस्टेंस द्वारा कॉल करने की आवश्यकता है।

    यहां एक संदेह है: यह हो सकता है कि कंप्यूटर पर स्थानीय डीबी के कई उदाहरण हैं, और हमें यह निर्दिष्ट करने की आवश्यकता है कि हम किस का उपयोग करना चाहते हैं। दुर्भाग्यवश, यह उत्तर देने में सहायता नहीं करता है कि आपको metadata को बदलने की आवश्यकता क्यों है।

    यह आपके जैसा सामना करने की तुलना में अलग समस्या है, क्योंकि आपको एंटिटी फ्रेमवर्क metadata बदलने की आवश्यकता है जबकि मुझे provider connection string को बदलने की आवश्यकता है। संयोग?

  • +0

    @downvoter टिप्पणी करने की कोशिश कर रहा हूं? –

    +0

    निश्चित - यह सही समाधान नहीं है और इसे बक्षीस नहीं दिया जाना चाहिए था। मैंने शीर्ष पर सही उत्तर देने के लिए डाउनवॉटेड किया - एक विंडोज सेवा को मेटा संसाधन –

    संबंधित मुद्दे