There was an error invoking hub method

User74750653 posted
  • Remove From My Forums
  • Question

  • User74750653 posted

    Up through SignalR 1.0 RC2, when a hub method threw an exception, the message for the exception got passed down to the client. Now, in 1.0 RTW, when a hub method throws an exception, it simply returns the error message «There was an error invoking
    Hub method ‘roomhub.GetRoomDescriptor'». This is problematic, because it means that there’s no way to figure out what the error was. I know that I could work around this if you wrap every hub method that might throw with a special «Result» object that includes
    an Error property, and check that, but that’s a PITA. I really liked being able to handle failures in the JQueryDeferred fail() handler: it was nice, it was clean, it was easy.

    So two questions:

    (1) What’s the best way to pass error messages from SignalR down to the client? 

    (2) Why did this get changed?

Answers

  • User74750653 posted

    Never mind. Looking at the code, I figured it out. You just need to change how you call MapHubs():

    RouteTable.Routes.MapHubs(new HubConfiguration { EnableDetailedErrors = true });
    
    • Marked as answer by

      Thursday, October 7, 2021 12:00 AM

    • Marked as answer by
      Anonymous
      Thursday, October 7, 2021 12:00 AM

сервер:

public void AddLine(string line)
{
    Clients.Others.addLine(line);
}

клиент .NET:

await rtHubProxy.Invoke("AddLine", "lineInfo");

исключения:

InvalidOperationException: There was an error invoking Hub method 'xxx.AddLine'.

на самом деле, я пытался вызвать метод со сложным объектом, только чтобы найти исключение. Поэтому я изменил тип параметра и оставил тело AddLine() пустым для целей отладки, что, как ни странно, все равно вызвало то же исключение.

у меня также есть другой вызов SignalR на стороне клиента, всего несколько строк выше, который работает отзывчиво без ошибок. Соответствующий серверный код выглядит следующим образом:

public void Hello(string text)
{
    Clients.All.hello(text);
}

может кто-нибудь узнать, где я ошибся? Я отлаживал более 4 часов и до сих пор не могу найти отмену даже после того, как я упростил код.

(орфография строго проверяют, совпадают.)

2 ответов


очевидно, что у вас есть некоторые проблемы на стороне сервера. Но чтобы узнать, в чем проблема, вам нужно увидеть подробную ошибку.
По соображениям безопасности SignalR не дает вам подробную ошибку по умолчанию. Но вы можете отредактировать свой код, чтобы получить подробную ошибку.

сначала вам нужно добавить этот код в Startup.cs:

var hubConfiguration = new HubConfiguration();
    hubConfiguration.EnableDetailedErrors = true;
    app.MapSignalR(hubConfiguration);

затем, чтобы показать ошибку на стороне клиента, вам нужно добавить этот код в свой проект:

$.connection.hub.error(function (error) {
    console.log('SignalR error: ' + error)
});

Так Просто, и ты хороший, чтобы пойти.

иногда вы даже не добираетесь до клиентской части, чтобы увидеть ошибку. Но, выполнив первую часть, вы включите подробную ошибку, и вы можете увидеть ошибки в ответе SignalR. Вам просто нужен инструмент, как Chrome Browser Web Developer Tool, который дает вам сетевую часть операции, где все состояние передачи данных регистрируются. вы можете проверить ошибки SignalR там. Информация в журнале будет очень подробной и полезной.

Это пример отладки с браузером Chrome для людей, которые видят ошибки SignalR через инструмент отладки Chrome:

Скачать Полный Размер Изображения

This is for people who want to debug the ajax response through Chrome Browser

Дайте мне знать, если у вас есть другие проблемы о том, что.

для дополнительной информации перейдите по ссылке: Ошибки SignalR


хорошо, после 2 часов и половины скалистой отладки, я, наконец, узнал правду, понимая, что weiredly, однако я изменил свой серверный код, механизм под прикрытием или функциональные возможности каким-то образом не синхронизировались, пока я случайно не перестроил проект и ждал, что IIS Express снова прогреется.

Это не ошибка SignalR, но Visual Studio, я думаю. Каждый раз, когда я делаю некоторые изменения в классе-концентраторе, мне приходится перестраивать серверный проект. Вот и все. Мне пришлось скажем, это действительно больно, хотя я не знаю, почему это должно произойти — может быть, потому, что мое решение состоит из WinRT и ASP.NET проект, который не ладится? Я не знаю.

FYI, я прикреплю ссылку на сообщение, в котором аналогичная проблема «перестроения» произошла с кем-то другим.

http://forum.kooboo.com/yaf_postst2250_How-to-use-SignalR-in-a-Module.aspx

и обходной путь на данный момент более чем прост — просто идите и ВОССТАНОВИТЬ.


Keith
asked on 26 Jun 2017, 02:21 PM

Just want to share this in case anyone else runs into it.  When a Kendo UI grid is bound to a SignalR datasource and Batch = true for that datasource, the server will begin responding with the following during create/update/destroy method calls:

{"I":"1","E":"There was an error invoking Hub method 'tranimporterrorshub.update'."}

This is because the automatically generated JSON is in an incorrect format to bind to your hub methods.  

Example hub method: 

public class ExampleHub : Hub

{

    public DataSourceResult Read(DataSourceRequest request)

    {

        // read operations here

    }

    public async Task Update(IEnumerable<ExampleViewModel> rows)

    {

        foreach (var row in rows)

        {

            // Update operations here

        }

    }

    public async Task Destroy(IEnumerable<ExampleViewModel> rows)

    {

        foreach (var row in rows)

        {

            // Delete operations here

        }

    }

}

When the JSON for create/update/destroy is generated, it is something like this:

data:{"H":"exampleshub","M":"update","A":[{"models":[{"Id":1,"Example":"Test"},{"Id":3,"Example":"Test2"}]}],"I":2}

If you look closely, the «A» property in the JSON starts with a «[«, which indicates an array, even though there is NOT an array of models.  ASP.NET MVC SignalR does not support a call with the «data» being an array (must be an object or basic type) and the following exception is thrown:

Exception: Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll ("Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.IEnumerable`1[ExampleViewModel]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

Path 'models', line 1, position 10.").

I found a fix for this.  Simply add this function and wire it up to the parameterMap property for your DataSource:

function datasourceParameterMap(data, type) {

    if (type !== 'read' && data.models) {

        return data.models;

    } else {

        return data;

    }

}

Hope this helps someone else so that they don’t have to figure it out the hard way.

Понравилась статья? Поделить с друзьями:
  • There appears to be an error with the database ipb
  • Themida что это ошибка
  • The witcher 3 как изменить разрешение
  • U1112 ошибка хендай avante
  • U1112 ошибка kia picanto