2017-11-22 3 views
0

これはなぜ起こっているのか分かりません。私はAngry 4アプリをホスティングサーバーからのsignalRハブに接続しています。それはチャームのように機能します(バージョン2.2.2)接続応答のプロパティはラクダのケースです

もう1つのシグナルR接続を別のプロジェクトに追加する必要があります。 PascalCaseではなく、レスポンスのプロパティがすべてcamelCaseである理由です。しかし、jquery.signalr-2.2.2.jsファイルは、それらがPascalCaseであると予想し、サーバーのバージョンが「未定義」であるというエラーをスローします。

彼はres.ProtocolVersionを探しており、そのプロパティはデシリアライズされたレスポンスに存在しないため、「未定義」は論理的です。私はres.protocolVersionを持っていますが、それは彼が必要とする正確な値を保持しています。

私はこれで多くの時間を失ってきました、どんな助けも真剣に評価されています!

debug of jquery.signalR-2.2.2.js

編集:@のロリー・mccrossan enter image description here 私は同じくらい考えて、私は、サーバー側のJSONシリアライザ/フォーマッタコード出ますが、無駄にコメント理由です。

私は次の

+1

を使用しています。 –

答えて

0

を見てだから私はインターネット上で、そしてもちろんいくつかのより多くの検索ロリーのヒントの後、他の誰かがこの問題に遭遇した任意の提案取っている:

SignalR : use camel case

をしかし、解決策は私のために働いていません:/

私は同様の解決策を見つけましたが、オブジェクトが特定のライブラリから来た場合を除いて、デフォルトの契約リゾルバを常に持っています私たちのビューモデル - 。 https://blogs.msdn.microsoft.com/stuartleeks/2012/09/10/automatic-camel-casing-of-properties-with-signalr-hubs/

注:これは完璧なソリューションではありませんが、それはだから私は与えている既存のコードとうまく結びつきことをすべて一緒に新しい解決策を考え出した私のシナリオ

のための最高のを働いたものです私は問題です。

これを回避するもう1つの方法は、アプリにDefaultContractResolverを使用させることです。 SignalRは今接続しますが、残りのアプリケーションは中断します。私が取り組んでいるソリューションでこれを軽減するために、2つの簡単な拡張メソッドを使用しました。

は、まず私はいつも HttpResponseMessageを返します CamelCasePropertyNamesContractResolver

public static class HttpConfigurationExtensions 
    { 
     public static HttpConfiguration ToCamelCaseHttpConfiguration(this HttpConfiguration configuration) 
     { 
      var jsonFormatter = configuration.Formatters.OfType<JsonMediaTypeFormatter>().FirstOrDefault(); 
      bool needToAddFormatter = jsonFormatter == null; 
      if (needToAddFormatter) 
      { 
       jsonFormatter = new JsonMediaTypeFormatter(); 
      } 
      jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      jsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; 
      if (needToAddFormatter) 
      { 
       configuration.Formatters.Add(jsonFormatter); 
      } 
      return configuration; 
     } 
    } 

既存のWeb APIのためのフォーマッタを交換するHttpConfigurationクラスを拡張し、私は私がやった方法でそれについては行くことができる理由です。 API呼び出し

[Route("")] 
[HttpPost] 
public async Task<HttpResponseMessage> CreateSetting(Setting setting) 
{ 
    // the response object is basically the data you want to return 
    var responseData = await ... 

    return Request.CreateResponse(responseData.StatusCode, responseData); 
} 

例私はすべてのAPI呼び出しがRequest.CreateResponse(...)メソッドを使用していた気づきました。私がすぐに見ていないのは、マイクロソフトが実際にすべての必要なオーバーロードを予知していたということです。つまり、私自身がRequest.CreateResponse(...)の実装を行うことができませんでした。

なぜそれがMakeResponse

public static class HttpRequestMessageExtensions 
{ 
    public static HttpResponseMessage MakeResponse<T>(this HttpRequestMessage request, T response) where T : Response 
    { 
     return request.CreateResponse(response.StatusCode, response, 
      request.GetConfiguration().ToCamelCaseHttpConfiguration()); 
    } 
} 

と呼ばれていますということResponseのクラスは、あなたのAPIが返すようにするデータ構造です。私たちのAPIでは、それらはすべてこれらの構造の1つにラップされています。これにより、Slack API上の応答と同様の応答を持つAPIが生成されます。

は、だから今のコントローラはすべて、これはあなたが要求に応答するようにサーバーを設定している方法と設定の問題であるRequest.MakeResponse(responseData)

関連する問題