2013-09-24 31 views
6

Trước khi hỏi một câu hỏi riêng biệt, tôi đã thực hiện rất nhiều googling về nó và thêm một bình luận trong stackoverflow đã tồn tại question.Lỗi máy chủ SignalR "ConnectionId có định dạng không đúng." với Thư viện SignalR-ObjC

Tôi có một SignalR Hub (thử cả v 1.1.3 và 2.0.0-rc.) Trong máy chủ của tôi với mã dưới đây:

[HubName("TestHub")] 
    public class TestHub : Hub 
    { 
      [Authorize] 
      public void TestMethod(string test) 
      { 
       //some stuff here 
       Clients.Caller.NotifyOnTestCompleted(); 
      } 
    } 

Vấn đề vẫn tồn tại nếu tôi loại bỏ các thuộc tính Authorize.

Và trong ứng dụng iOS của tôi, tôi cố gắng gọi nó với mã bên dưới:

SRHubConnection *hubConnection = [SRHubConnection connectionWithURL:_baseURL]; 
    SRHubProxy *hubProxy = [hubConnection createHubProxy:@"TestHub"]; 
    [hubProxy on:@"NotifyOnTestCompleted" perform:self selector:@selector(stopConnection)]; 

    hubConnection.started = ^{ 
     [hubProxy invoke:@"TestMethod" withArgs:@[@"test"]]; 
    }; 

    //received, error handling 
    [hubConnection start]; 

Khi ứng dụng bắt đầu người dùng không đăng nhập và không có kết nối SignalR mở. Người dùng đăng nhập bằng cách gọi dịch vụ Đăng nhập trong máy chủ sử dụng phương thức WebSecurity.Login. Nếu dịch vụ đăng nhập trả về thành công thì tôi thực hiện cuộc gọi ở trên đến SignalR Hub và tôi gặp lỗi máy chủ 500 với mô tả "ConnectionId có định dạng không chính xác".

Máy chủ đầy đủ stacktrace như sau:

Exception information: 
     Exception type: InvalidOperationException 
     Exception message: The ConnectionId is in the incorrect format. 
     at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context, String connectionToken) 
     at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context) 
     at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext context) 
     at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment) 
     at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- 
     at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
     at   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) 
     at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
     at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 



    Request information: 
     Request URL: http://myserverip/signalr/signalr/connect?transport=webSockets&connectionToken=axJs EQMZxpmUopL36owSUkdhNs85E0fyB2XvV5R5znZfXYI/CiPbTRQ3kASc3 mq60cLkZU7coYo1P fbC0U1LR2rI6WIvCNIMOmv/mHut/Unt9mX3XFkQb053DmWgCan5zHA==&connectionData=[{"Name":"testhub"}] 
     Request path: /signalr/signalr/connect 
     User host address: 
     User: 
     Is authenticated: False 
     Authentication Type: 
     Thread account name: IIS APPPOOL\DefaultAppPool 

    Thread information: 
     Thread ID: 14 
     Thread account name: IIS APPPOOL\DefaultAppPool 
     Is impersonating: True 
     Stack trace: at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context, String connectionToken) 
     at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context) 
     at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext context) 
     at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment) 
     at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- 
     at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
       at       Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) 
       at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
       at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Tôi hiểu đây là một số loại xác thực và nhận dạng người dùng mismatching nhưng đến nay tôi đã tìm thấy không có cách nào giải quyết nó. Tất cả các câu hỏi khác đề nghị dừng kết nối đã mở khi nhận dạng người dùng thay đổi nhưng như tôi đã đề cập ở trên, tôi không có kết nối mở trước khi người dùng đăng nhập thành công.

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn bạn.

+0

Bạn đã tìm thấy giải pháp cho điều này chưa? Im có cùng một vấn đề. – tremolo

+0

Tôi nhận được lỗi này khoảng 4 trong số 5 lần.Vì vậy, đôi khi, kết nối không tạo ra lỗi connectionId trên máy chủ, nhưng hầu hết thời gian, nó. Tuy nhiên, tôi không có bất kỳ quá trình xác thực nào. – tremolo

+0

@tremolo: Rất tiếc, chưa có giải pháp nào. – ozzotto

Trả lời

1

Chúng tôi đã gặp sự cố tương tự. Tắt các chức năng mã hóa cho mã thông báo kết nối đã sửa nó.

Rất tiếc, tôi không thể trợ giúp thêm vì tôi đang làm việc ở cuối iOS chứ không phải kết thúc .net.

+0

Bạn đã vô hiệu hóa mã hóa mã thông báo kết nối như thế nào? – nil

2

Dưới đây là những gì tôi tìm thấy, tôi đang cố gắng tạo một ứng dụng Flex/AS3 cho signalR. Nó chỉ sử dụng websockets nhưng đối với công việc của tôi tôi kiểm soát cả hai đầu của hệ thống vì vậy tôi biết phụ trợ của tôi sẽ hỗ trợ nó.

Dù sao thì, mẹo để giải quyết vấn đề này đối với tôi là mã hóa connectionToken. Mã signalR phía máy chủ đang cố gắng phân tích ID kết nối khỏi mã thông báo. Khi bạn nhận được mã thông báo từ máy chủ, nó là một phần của sự bắt tay đàm phán, khi bạn cố gắng gửi lại, bạn phải đảm bảo xóa ký hiệu "/" và "+" và mã hóa chúng tương ứng là% 2F và% 2B. Trong AS3, phương thức mã hóa url hoặc tương đương khác để lại dấu gạch chéo có lẽ vì nó là một ký tự url hợp lệ, nhưng vì giá trị được truyền trong chuỗi truy vấn cần phải được mã hóa.

Khi tôi đã thực hiện việc này, tôi đã ngừng nhận lỗi máy chủ 500 (ConnectionId ở định dạng không chính xác) và ổ cắm đã mở và tôi nhận được tin nhắn.

Hy vọng điều này sẽ hữu ích.

Jason

2

Hình như bạn đang sử dụng https://github.com/DyKnow/SignalR-ObjC hãy chắc chắn để sử dụng các chi nhánh tính năng 2.0.0.beta1 cho đến khi nó được kéo vào bậc thầy.

+0

cập nhật phiên bản đã giúp tôi giải quyết vấn đề. Lưu ý: Tôi đang sử dụng nhóm và thêm 'pod 'SignalR-ObjC',: git => 'https://github.com/DyKnow/SignalR-ObjC.git',: branch => 'feature-2.0.0. beta1'' trong podfile. hth – GraehamF

Các vấn đề liên quan