2015-11-03 5 views
6

मैं सेटअप एक सांत्वना अनुप्रयोग है कि सिर्फ एक पाश चलाता है और संदेश सिग्नल आर का उपयोग कर ग्राहक कि सुन रहा है एक कोणीय अनुप्रयोग है उत्सर्जन करता है।SignalR त्रुटि जब परीक्षण के खिलाफ Vagrant वीएम

जब मैं स्थानीय रूप से चलाने के लिए, (दोनों कंसोल आवेदन और कोणीय साइट) यह ठीक काम करता है। हालांकि, जब मैं अपने Vagrant वी एम (उबंटू होस्ट) में मेरे कंसोल एप्लिकेशन को चलाने के लिए, तो मैं एक सब भी परिचित त्रुटि संदेश जैसे कि निम्न मिलती है:

GET http://localhost:12345/signalr/negotiate?clientProtocol=1.5&userId=12345&connectionData=%5B%7B%22 
name%22%3A%22testem 
itter%22%7D%5D&_=1446565284280 500 (Internal Server Error) 

मैंने पहले यह करने के लिए इसी तरह के मुद्दों में भाग लिया है (शायद इस

namespace test 
    { 
     public class Program 
     { 
      public static void Main(string[] args) 
      { 
       try 
       { 
        using (WebApp.Start<EmmitStartup>("http://*:12345")) 
        { 
         Console.Out.WriteLine("Emmit started on http://*:12345"); 

         IEmitterFactory factory = new EmitterFactory(); 
         while (true) 
         { 
          Thread.Sleep(5000); 
          ITestEmitter emitter = factory.Create((ctx) => 
           { 
            return new TestEmitter(ctx); 
           }); 
          emitter.SayHello(); 
          emitter.Echo("Hello World:" + DateTime.Now); 
         } 
        } 
       } 
       catch (Exception e) 
       { 
        Console.Out.WriteLine(e.Message); 
        Console.Out.WriteLine(e.StackTrace); 
        Console.ReadLine(); 
       } 
      } 
     } 

     public class TestEmitter:Emitter,ITestEmitter 
     { 
      public TestEmitter(IEmitterContext emitterContext) : base(emitterContext) 
      { 
      } 

      public TestEmitter(IEmitterContext emitterContext, EmitterModel model) : base(emitterContext, model) 
      { 
      } 

      public TestEmitter(IDictionary<string, object> model) : base(model) 
      { 
      } 

      public void SayHello() 
      { 
       EmitterContext.Clients.All.onSayHello(); 
      } 

      public void Echo(string message) 
      { 
       EmitterContext.Clients.All.onEcho(message); 
      } 
     } 

     public interface ITestEmitter 
     { 
      void SayHello(); 
      void Echo(string message); 
     } 
     public class EmmitStartup 
     { 
      public void Configuration(IAppBuilder app) 
      { 

       app.UseCors(CorsOptions.AllowAll); 
       app.Map("/signalr", map => 
       { 
        map.UseCors(CorsOptions.AllowAll); 
        GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule()); 
        var config = new HubConfiguration() 
        { 
         EnableDetailedErrors = true, 
         EnableJavaScriptProxies = true, 
         EnableJSONP = true 
        }; 
        map.RunSignalR(config); 
       }); 
      } 
     } 
    } 
  1. कोई अपवाद या त्रुटि लॉग सर्वर पर फेंका जा रही हैं: सटीक एक) इसलिए यहाँ कुछ प्रारंभिक जानकारी के

    कोड मैं ऐसा दिखाई देता है।

  2. SignalR
  3. में मैं सक्षम किया है CORS मैं दोनों http://*:12345 और http://localhost:12345 और http://0.0.0.0:12345
  4. Emmit पुस्तकालय बस वाक्यात्मक चीनी का उपयोग करने की कोशिश की और SignalR के माध्यम से प्रत्यक्ष पास बनाता है (मैं सीधे SignalR साथ ही सटीक कोशिश की है।
  5. मैं सक्षम करने के विभिन्न संयोजनों की कोशिश की है/EnableJSONP
  6. अक्षम करने मैं जानता हूँ कि SignalR काम करने और वी एम के माध्यम से सुलभ है क्योंकि मैं http://localhost:12345/signalr/hubs हिट कर सकते हैं और यह प्रॉक्सी फ़ाइल को दर्शाता है।
  7. मैं बंदरगाह के लिए Vagrant वीएम करने के लिए सेटअप बंदरगाह fowarding है 12345
  8. मैं sudo ufw disable

ग्राहक के लिए कोड ऐसा दिखाई देता साथ वीएम होस्ट (उबंटू) पर विकलांग फ़ायरवॉल है:

var emmitProxy = null; 
    Emmit.createProxy({ 
     emitter:'testEmitter', 
     path:'http://localhost:12345/signalr', 
     listeners:{ 
      'onSayHello':function(){ 
       $log.info('onSayHello triggered') 
      }, 
      'onEcho':function(message){ 
       $log.info(message); 
      } 
     }, 
     onError:function(){ 
      //an error occured 
      $log.error('testEmitter:onError'); 
     }, 
     onDisconnected:function(){ 
      //proxy was disconnected 
      $log.debug('testEmitter:onDisconnected'); 
     }, 
     queryParams:{ 
      userId:'12345' //optional 
     } 
    }).then(function(newProxy){ 
     emmitProxy = newProxy; 
    }); 

अद्यतन

मैंने लॉगिंग सक्षम किया और यहां आउटपुट है। किसी अन्य व्यक्ति की सिफारिश करने से पहले मैं सीओआरएस सक्षम करता हूं, मुझे नहीं लगता कि सीओआरएस मुद्दा है, मुझे लगता है कि यह किसी अन्य समस्या का कैस्केडिंग प्रभाव है।

enter image description here

अद्यतन

मैं निम्नलिखित परिणाम के साथ कई वातावरण में इस भाग गया है Vagrant वी एम (उबंटू) पर डोकर कंटेनर में

  1. दौड़ा - त्रुटि होती है
  2. सीधे वग्रेंट वीएम (उबंटू) पर दौड़ें - त्रुटि ओसीसीआरएस
  3. परिनियोजन डोकर कंटेनर Tutum करने के लिए घ - त्रुटि होती है
  4. विंडोज पर दृश्य स्टूडियो के माध्यम से सीधे Ran - सब कुछ काम करता है
  5. (स्पष्ट रूप से मोनो पर) मैक OSX पर सीधे Ran - सब कुछ काम करता है

मैं निम्नलिखित IHubPipelineModule जोड़ लिया है

public class ErrorHandlingPipelineModule:HubPipelineModule 
{ 
    public override Func<HubDescriptor, IRequest, bool> BuildAuthorizeConnect (Func<HubDescriptor, IRequest, bool> authorizeConnect) 
    { 
      try 
      { 
       Console.Out.WriteLine ("BuildAuthorizeConnect"); 
       return base.BuildAuthorizeConnect (authorizeConnect); 
      } 
      catch (Exception exception) 
      { 
       Console.Out.WriteLine ("AuthorizeConnect Failure"); 
       Console.Out.WriteLine(exception.Message); 
      } 
      return base.BuildAuthorizeConnect(authorizeConnect); 
    } 

    protected override void OnAfterDisconnect (IHub hub, bool stopCalled) 
    { 
     try 
     { 
      Console.Out.WriteLine ("OnAfterDisconnect"); 
      base.OnAfterDisconnect (hub, stopCalled); 
      Console.Out.WriteLine ("After OnAfterDisconnect"); 
     } 
     catch (Exception exception) 
     { 
      Console.Out.WriteLine ("AfterDisconnect Failure"); 
      Console.Out.WriteLine(exception.Message); 
     } 
    } 

    protected override bool OnBeforeDisconnect (IHub hub, bool stopCalled) 
    { 
      try 
      { 
       Console.Out.WriteLine ("OnBeforeDisconnect"); 
       return base.OnBeforeDisconnect (hub, stopCalled); 
      } 
      catch (Exception exception) 
      { 
       Console.Out.WriteLine ("BeforeDisconnect Failure"); 
       Console.Out.WriteLine(exception.Message); 
      } 
      return base.OnBeforeDisconnect (hub, stopCalled); 
    } 


    public override Func<IHub, System.Threading.Tasks.Task> BuildConnect(Func<IHub, System.Threading.Tasks.Task> connect) 
    { 
      try 
      { 
       Console.Out.WriteLine("BuildConnect"); 
       return base.BuildConnect(connect); 
      } 
      catch (Exception exception) 
      { 
       Console.Out.WriteLine(exception.Message); 
      } 
      return base.BuildConnect(connect); 
    } 

    protected override void OnAfterConnect(IHub hub) 
    { 
     try 
     { 
      Console.Out.WriteLine("OnAfterConnect"); 
      base.OnAfterConnect(hub); 
     } 
     catch (Exception exception) 
     { 
      Console.Out.WriteLine ("OnAfterConnect Failure"); 
      Console.Out.WriteLine(exception.Message); 
     } 
    } 

    protected override bool OnBeforeConnect(IHub hub) 
    { 
     try 
     { 
      Console.Out.WriteLine("OnBeforeConnect"); 
      return base.OnBeforeConnect(hub); 
     } 
     catch (Exception exception) 
     { 
      Console.Out.WriteLine ("OnBeforeConnect Failure"); 
      Console.Out.WriteLine(exception.Message); 
     } 
     return base.OnBeforeConnect (hub); 
    } 
} 

और जब मैं अपने लॉग की जांच, केवल लॉग बाहर मुद्रित कर रहे हैं निम्नलिखित हैं:

BuildConnect 
BuildAuthorizeConnect 

अद्यतन मैं या यकीन है कि अगर यह प्रासंगिक होगा नहीं कर रहा हूँ मैं इसे कैसे चूक गए हों, लेकिन मैं 500 से प्रतिक्रिया की जाँच की और यह Here

ऐसा लगता है कि करने के लिए तैनात किया है जैसे कि यह यह है दिखाया जा रहा है Improperly protected user's key pairs in '/root/.config/.mono/keypairs'.

से संबंधित भी, मुझे यकीन नहीं है कि इस लिंक में संवेदनशील जानकारी है या नहीं। अगर कोई मुझे बताए तो मुझे बता सकता है, तो मैं इसकी सराहना करता हूं।

मैं अब तक अनुसंधान का एक न्यूनतम राशि से किया था और जब मैं बातचीत के अनुरोध के लिए नेटवर्क टैब की जाँच भर SignalR.Owin works under Windows but returns 500 for Mono on Linux

आया, मैं निम्नलिखित

** हेडर मिल ** रिमोट पता: 127.0 .0.1: 12345 अनुरोध URL: http://localhost:12345/signalr/negotiate?clientProtocol=1.5&userId=12345&connectionData=%5B%7B%22name%22%3A%22testemitter%22%7D%5D&_=1446964166640 अनुरोध विधि: प्राप्त स्थिति कोड: 500 आंतरिक सर्वर त्रुटि

HTTP/1.1 500 Internal Server Error 
    Access-Control-Allow-Origin: http://localhost:8100 
    Access-Control-Allow-Credentials: true 
    X-Content-Type-Options: nosniff 
    Content-Type: text/html 
    Server: Mono-HTTPAPI/1.0 
    Date: Sun, 08 Nov 2015 06:30:28 GMT 
    Connection: close 
    Transfer-Encoding: chunked 

    Accept:text/plain, */*; q=0.01 
    Accept-Encoding:gzip, deflate, sdch 
    Accept-Language:en-US,en;q=0.8 
    Cache-Control:no-cache 
    Connection:keep-alive 
    Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
    Cookie:JSESSIONID.ae4b31f4=aqpz31hevinaauwftyijure; JSESSIONID.26c95422=1m32u58exuvjz5jrojszqziqh; JSESSIONID.3fd19426=iv9fawaej3nt14yzcruj45si5; JSESSIONID.8868ba42=1gh4w06alx8ehuuj1adr5w8y8; JSESSIONID.947cfb91=nyxfrp6u0pny1sl8gwlouprh4; screenResolution=1280x800 
    Host:localhost:12345 
    Origin:http://localhost:8100 
    Pragma:no-cache 
    Referer:http://localhost:8100/ 
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36 

उत्तर

3

हालांकि आपके ऐप में app.UseCors(CorsOptions.AllowAll) है, मूल त्रुटि संदेश यह स्पष्ट है कि यह एक कोरस मुद्दा है।

Original Error message

उत्पत्ति यूआरएल (http://localhost:8100) SignalR सर्वर URL (http://localhost:12345) CORS, योजना, डोमेन के साथ की तुलना में अलग है, और बंदरगाह से मेल करने के लिए है; इस मामले में, बंदरगाह अलग है।

यहाँ क्या करना है:

  1. सुनिश्चित यूआरएल वास्तव में सही हैं और आप क्या उम्मीद कर रहे हैं।(पोर्ट 8100)
  2. क्लाइंट पर HTTP ट्रैफ़िक कैप्चर करें। आप फिडलर या इसी तरह के टूल का उपयोग करके ऐसा कर सकते हैं। आप क्रोम डीबगर के "नेटवर्क" टैब का भी उपयोग कर सकते हैं।
  3. सत्यापित करें कि प्रारंभिक पृष्ठ लोड में वास्तव में CORS शीर्षलेख शामिल है। आपको प्रतिक्रिया शीर्षलेख में Access-Control-Allow-Origin: देखना चाहिए। आप इसे कैसे कॉन्फ़िगर कर लिया है के आधार पर, मूल्य होना चाहिए: *

... मेरा मानना ​​है कि यहां मुद्दा यह है कि आप SignalR सर्वर (पोर्ट 12345) पर CORS सक्रिय कर दिया है है, लेकिन CORS होने की जरूरत है आपके वेबसर्वर पर सक्षम (पोर्ट 8100)

संपादित

मूल प्रश्न संपादित किया गया था। HTTP शीर्षलेखों के अतिरिक्त, त्रुटि संदेश को CORS समस्या से 500 त्रुटि में बदल दिया गया है।

CryptographicException: Improperly protected user's key pairs in '/root/.config/.mono/keypairs'. 
... 
CryptographicException: Data protection failed. 
System.Security.Cryptography.ProtectedData.Protect (System.Byte[] userData, System.Byte[] optionalEntropy, DataProtectionScope scope) [0x00000] 
Microsoft.AspNet.SignalR.Infrastructure.DefaultProtectedData.Protect (System.String data, System.String purpose) [0x00000] 

मैं अब तक अनुसंधान का एक न्यूनतम राशि से किया था और

GitHub Issue है कि आप वास्तव में से जुड़ा हुआ से मेल खाता है कि तुम क्या वर्णन किया है SignalR.Owin works under Windows but returns 500 for Mono on Linux बारे में जाना। चूंकि इसे बंद चिह्नित किया गया है, इसलिए स्पष्ट प्रश्न यह है कि टिकट में वर्णित क्या है, यह भी आपके लिए लागू होता है। टिकट से:

davidfowl 22 मई, 2013 पर टिप्पणी की - मैं सिर्फ कल देव शाखा में निर्माण तय की। इसे चलाने के लिए मोनो 3.0.10 की आवश्यकता है और अभी ठीक काम करता है।

  1. मोनो के संस्करण अपने सर्वर पर स्थापित:

तो, दो चीजों की पुष्टि करें। टिकट का कहना है कि मोनो 3.0.10 की जरूरत है। आपके पास क्या संस्करण है?

  • सिग्नलआर में परिवर्तनों को शामिल करने की आवश्यकता है। यह इनमें से एक या दोनों है। कि जो कुछ भी SignalR आप उपयोग कर रहे के संस्करण सुनिश्चित इन परिवर्तनों में शामिल हैं:
  • अंत में, आप करने के लिए, अपने स्वयं के संस्करण इंजेक्शन लगाने का विकल्प होता है तुम क्या जरूरत है सिग्नलआर। कोर/इंफ्रास्ट्रक्चर/डिफॉल्ट संरक्षित डेटाटा। आप बस set it in the OWIN pipeline कर सकते हैं। SignalR Source Code से:

      // Use the data protection provider from app builder and fallback to the 
          // Dpapi provider 
          IDataProtectionProvider provider = builder.GetDataProtectionProvider(); 
          IProtectedData protectedData; 
    
    +0

    यदि यह सीओआरएस था तो यह बिल्कुल काम नहीं करेगा?जैसा कि मैंने उल्लेख किया है कि यह स्थानीय रूप से पूरी तरह से ठीक काम करता है और यह विभिन्न बंदरगाहों से आ रहा है। – TheJediCowboy

    +0

    क्या आपने HTTP शीर्षलेख सत्यापित किए हैं? –

    +0

    मैं वास्तव में इसे अभी खींच रहा हूं। अन्य सामान में लपेटा गया था। – TheJediCowboy

    0

    समस्या और संभावित समाधान में अंतर्दृष्टि के लिए चयनित जवाब देखें।

    मैंने यह सुनिश्चित करके समस्या हल की कि मेरे पास मोनो 3.0.10 या बाद का संस्करण था। मैं डॉकर का उपयोग कर रहा हूं, इसलिए यह मेरे डॉकरफ़ाइल में मेरे FROM कथन को अपडेट करने जितना आसान था।

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