2012-12-19 5 views
3

SignalR에 새로 왔으며 ASP.NET MVC 3에서 signalR을 사용하여 간단한 채팅 응용 프로그램을 개발하려고합니다. Tutorial: Getting Started with SignalR (C#) 참조.Microsoft.AspNet.SignalR : 캡처 못함 TypeError : Object # <Object>에는 'Logon'메서드가 없습니다.

ChatHub

public class ChatHub : Hub 
{ 
    private static readonly Dictionary<string, ChatUser> _users 
     = new Dictionary<string, ChatUser>(StringComparer.OrdinalIgnoreCase); 

    public Task Send(string message) 
    { 
     var user = _users.Values.FirstOrDefault(u => u.ClientId == Context.ConnectionId); 

     if (user == null) 
     { 
      throw new Exception("User is not logged in"); 
     } 

     return Clients.All.message(user.Name, message, TimeStamp()); 
    } 

    public void Logon(string clientName) 
    { 
     if (clientName.Length > 10) 
     { 
      throw new Exception("I prefer short names."); 
     } 

     if (_users.Any(x => x.Key == clientName)) 
     { 
      throw new Exception("User name is already taken, please select a different one."); 
     } 

     _users.Add(clientName, new ChatUser { ClientId = Context.ConnectionId, Name = clientName }); 

     Clients.Caller.name = clientName; 

     Clients.All.loggedOn(clientName, TimeStamp()); 
    } 

    public Task Logout() 
    { 
     var user = _users.Values.FirstOrDefault(u => u.ClientId == Context.ConnectionId); 

     if (user != null) 
     { 
      _users.Remove(user.Name); 
      return Clients.All.loggedOff(user.Name, TimeStamp()); 
     } 

     return null; 
    } 



    public IEnumerable<ChatUser> GetUsers() 
    { 
     return _users.Values.OrderBy(x => x.Name); 
    } 

    private static string TimeStamp() 
    { 
     return DateTime.Now.ToShortTimeString(); 
    } 
} 

ChatUser 클래스

public class ChatUser 
{ 
    public string ClientId { get; set; } 
    public string Name { get; set; } 
} 

IndexView.chtml

SignalR C 모자

 <div id="info" class="round"> 
      <h1> 
       SignalR Chat</h1> 
      <form id="startform"> 
      Enter your name: 
      <input type="text" id="name" /> 
      <input type="button" id="btn_login" class="button" style="margin-top: 25px;" value="Start chatting" /> 
      </form> 
      <div id="login_error" style="margin-top: 100px;" class="error"> 
      </div> 
     </div> 

     <div id="chat"> 
      <div style="height: 50px;"> 
       <div>SignalRChat</div> 
       <div id="logout"> 
        <a href="" id="btn_logout">Logout</a> 
       </div> 
      </div> 
      <div class="users-box right round2"> 
       <strong>Users in chat:</strong> 
       <ul id="users"> 
       </ul> 
      </div> 
      <div class="chat-box round2"> 
       <div id="messages"> 
        <ul id="message-list"> 
        </ul> 
       </div> 
       <form id="chatform"> 
       <table width="100%"> 
        <tr> 
         <td> 
          <input type="text" id="msg" /> 
         </td> 
         <td align="right" width="100px"> 
          <input type="button" id="btn_send" class="button" value="Send" /> 
         </td> 
        </tr> 
       </table> 
       </form> 
      </div> 
     </div> 
    </div> 
</div> 


<!--Add script to update the page and send messages.--> 
<script type="text/javascript"> 
    $(function() { 
     var onlineUsers = null; 
     var userList = []; 
     var chat = $.connection.chatHub; 

     var getUsers = function() { 
      chat.server.getUsers().done(function (users) { 
       onlineUsers = users; 
       updateUserList(); 
      }); 
     }; 

     var updateUserList = function() { 
      $('#users li').remove(); 
      userList = []; 

      $.each(onlineUsers, function() { 
       var listItem = $('<li>{0}</li>'.format(this.Name)); 
       $('#users').append(listItem); 

       userList[this.Name] = User(this.Name, listItem); 
      }); 
     }; 

     var send = function() { 
      if ($('#msg').val() !== '') { 
       chat.server.Send($('#msg').val()); 
       $("#msg").val(''); 
      } 
     }; 

     var login = function() { 
      if ($('#name').val() !== '') { 
       clientName = $('#name').val(); 

       chat.server.Logon(clientName, function() { 
        $("#info").toggle(); 
        $("#chat").toggle(); 
        $('#msg').focus(); 
        getUsers(); 
       }).fail(function (e) { 
        $('#login_error').html(e); 
       }); 
      } 
     }; 

     var logout = function() { 
      chat.server.Logout(); 
     } 

     // Callbacks from server 
     chat.client.message = function (user, msg, time) { 
      $('#message-list').append('<li class="message">{0} {1}: {2}</li>'.format(time, user, msg)); 
      $("#messages").prop({ scrollTop: $("#messages").prop("scrollHeight") }); 
     }; 

     chat.client.loggedOn = function (user, time) { 
      $('#message-list').append('<li class="info">{0} {1} logged on</li>'.format(time, user)); 
      getUsers(); 
     }; 

     chat.client.loggedOff = function (user, time) { 
      $('#message-list').append('<li class="info">{0} {1} logged off</li>'.format(time, user)); 
      getUsers(); 
     }; 

     chat.client.userTyping = function (user) { 
      userList[user].typing(); 
     }; 

     // Form events 
     $("#btn_send").click(function() { send(); $('#msg').focus(); }); 
     $("#btn_login").click(function() { login(); }); 
     $("#btn_logout").click(function() { logout(); }); 
     $('#chatform').submit(function() { send(); return false; }); 
     $('#startform').submit(function() { login(); return false; }); 


     // Logout when user closes browser 
     window.onbeforeunload = function() { chat.server.Logout(); }; 

     // Start chat 
     $.connection.hub.start().done(function() { 
      alert("Connected"); 
     }); 

     $("#chat").toggle(); 
     $('#name').focus(); 

    }); 

</script> 

그러나 나는 Logon 방법 ChatHub의 호출하려고 할 때 다음과 같은 무엇입니까 : 내가 어디

Uncaught TypeError: Object # has no method 'Logon'

누구나 것은 나를 도와 틀린 나는 n을 SignalR로 코딩합니다.

답변

2

JavaScript를 통해 SignalR을 사용하여 서버 메소드와 통신 할 때 서버 메소드는 HubMethodName 속성을 통해 지정되지 않는 한 Camel Cased로 참조됩니다.

현재 코드를 계속 사용하려면 두 가지 방법으로 해결할 수 있습니다. 서버 측 허브에

  1. 올바른 이름을 가진 각 방법 위에 [HubMethodName("foo")]을 넣어. 그래서 로그온은 다음과 같습니다

    [HubMethodName("Logon")] public void Logon(string clientName) { ... }

  2. 를 자바 스크립트 스크립트에서 할 수있다 :

염두에 두어야

chat.server.logon(...);은 당신이 이러한 접근 방식 중 하나를 적용해야 할 것 모든 방법 (# 1을 통한) 또는 모든 통신 (# 2를 통한 서버).

희망이 도움이됩니다.

+0

첫 번째 해결책을 시도했지만 새로운 오류 '로그온'방법이 해결되지 않았습니다. 로그온 호출 실패 (function (e) { $ ('# login_error') .html (e);이 실행 중임) –

+0

발견 된 오류 ... Logon 메서드 호출에 잘못된 구문이 사용되었습니다. toggle(); $ ("# msg").()() ($ ("# 채팅"). ;)); 이제는 완벽하게 작동하고 있습니다. 그리고 도움을 주셔서 감사합니다 ... 솔루션이 완벽하게 작동합니다 (getUsers();}). –

+0

다행) =) –

관련 문제