2017-04-27 4 views
0

したがって、私はデバイスに関するデータを返すこのAPIを構築しました。私はとlocalYこのプロジェクトを実行すると、私の要求は私を与える結果が正しいです:私はアズールにこのプロジェクトを公開し、正確に同じ要求を行うとASP.net REST APIは、紺色の地方または地方の異なるデータを返します。

[ 
    { 
    "Id": "1", 
    "Name": "x1", 
    "LocationName": "Floor 2" 
    }, 
    { 
    "Id": "2", 
    "Name": "x2", 
    "LocationName": "Floor 2" 
    } 
] 

これは私が得るものです:

"Request": { 
    "AlwaysMultipartFormData": false, 
    "JsonSerializer": { 
     "DateFormat": null, 
     "RootElement": null, 
     "Namespace": null, 
     "ContentType": "application/json" 
    }, 
    "XmlSerializer": { 
     "RootElement": null, 
     "Namespace": null, 
     "DateFormat": null, 
     "ContentType": "text/xml" 
    }, 
    "ResponseWriter": null, 
    "UseDefaultCredentials": false, 
    "Parameters": [ 
     { 
     "Name": "Accept", 
     "Value": "application/json, application/xml, text/json, text/x-json, text/javascript, text/xml", 
     "Type": 3, 
     "ContentType": null 
     } 
    ], 
    "Files": [], 
    "Method": 0, 
    "Resource": "devices", 
    "RequestFormat": 1, 
    "RootElement": null, 
    "OnBeforeDeserialization": { 
     "Delegate": { 
     "type": "System.Action`1[[RestSharp.IRestResponse, RestSharp, Version=105.2.3.0, Culture=neutral, PublicKeyToken=null]]", 
     "assembly": "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 
     "target": null, 
     "targetTypeAssembly": "RestSharp, Version=105.2.3.0, Culture=neutral, PublicKeyToken=null", 
     "targetTypeName": "RestSharp.RestRequest", 
     "methodName": "<.ctor>b__0", 
     "delegateEntry": null 
     }, 
     "method0": { 
     "Name": "<.ctor>b__0", 
     "AssemblyName": "RestSharp, Version=105.2.3.0, Culture=neutral, PublicKeyToken=null", 
     "ClassName": "RestSharp.RestRequest", 
     "Signature": "Void <.ctor>b__0(RestSharp.IRestResponse)", 
     "Signature2": "System.Void <.ctor>b__0(RestSharp.IRestResponse)", 
     "MemberType": 8, 
     "GenericArguments": null 
     } 
    }, 
    "DateFormat": null, 
    "XmlNamespace": null, 
    "Credentials": null, 
    "UserState": null, 
    "Timeout": 0, 
    "ReadWriteTimeout": 0, 
    "Attempts": 1 
    }, 
    "ContentType": "application/json; charset=utf-8", 
    "ContentLength": -1, 
    "ContentEncoding": "", 
    "Content": "[\r\n {\r\n \"$id\": \"1\",\r\n \"id\": \"1\",\r\n \"name\": \"x1\",\r\n \"deviceTypeName\": \"Brickstream\",\r\n \"lastSeen\":.... 

それHttpResponseMessageオブジェクトの文字列表現のように見えます。内容の下で見ることができるように、私はローカルでリクエストをした時と同じ出力をしています。今質問です、私はここで何が間違っていますか?

コード:

[Route("")] 
public HttpResponseMessage GetAllDevicesLocation(string location) 
{ 
    var request = new RestRequest(); 
    request = new RestRequest($"devices", Method.GET); 
    IRestResponse response = client.Execute(request); 

    string serializedItemsFromBackend = response.Content; 
    var deserializedItemsFromBackend = JsonConvert.DeserializeObject<List<DeviceModels>>(serializedItemsFromBackend); 
    List<DeviceModels> list = new List<DeviceModels>(); 

    foreach (DeviceModels device in deserializedItemsFromBackend) 
    { 
     if (device.LocationName.Equals(location)) 
     { 
      list.Add(device); 
     } 
    } 
    if (list.Count > 0) 
    { 
     return CreateResponse(JsonConvert.SerializeObject(list)); 
    } 
    return Request.CreateResponse(HttpStatusCode.NotFound, "Devices in that area wasn't found."); 
} 

私は、これは昨日働いたことを誓うことができます。私の他のエンドポイントは、うまく動作する。..

EDITこのエンドポイントは、ローカルおよび紺碧の上に私に正しい結果が得られます::

[Route("{name}")] 
     public HttpResponseMessage GetDevice(string name) 
     { 
      var request = new RestRequest(); 
      request = new RestRequest($"devices", Method.GET); 
      IRestResponse response = client.Execute(request); 

      string serializedItemsFromBackend = response.Content; 
      var deserializedItemsFromBackend = JsonConvert.DeserializeObject<List<DeviceModels>>(serializedItemsFromBackend); 

      foreach (DeviceModels device in deserializedItemsFromBackend) 
      { 
       if (device.Name.Equals(name)) 
       { 
        return CreateResponse(JsonConvert.SerializeObject(device)); 
       } 
      } 
      return Request.CreateResponse(HttpStatusCode.NotFound, "Device with that name wasn't found."); 
     } 
+0

これはWebアプリケーションなのですか? – Kamo

+0

WebAppです.- – knuddan

+0

コンテンツタグを抽出し、その特定のタグに対して逆シリアル化を使用する必要があります。またはデシリアライゼーションを修正してレスポンス処理も含める必要があります –

答えて

0

私は私の側の問題を再現するには、次のサンプル、返すサンプルを作成しますHttpResponseMessageは、ローカルとAzureの両方のWebサイトでうまく動作します。新しいWeb APIプロジェクトを作成して戻り値をHTTP応答メッセージに直接変換し、プロジェクトが期待どおりに機能するかどうかを確認するために新しいAzure Webサイトにプロジェクトを公開することができます。

私のコントローラのアクション

public class ValuesController : ApiController 
{ 
    public HttpResponseMessage Get() 
    { 
     List<DeviceModels> list = new List<DeviceModels>(); 
     list.Add(new DeviceModels() { Id = "1", Name = "x1", LocationName = "Floor 2" }); 
     list.Add(new DeviceModels() { Id = "2", Name = "x2", LocationName = "Floor 2" }); 

     HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(list)); 

     return response; 
    } 
} 

enter image description here

可能な場合は、直接JSON文字列を返すために、あなたのコントローラのアクションを変更することができます。

public string GetAllDevicesLocation(string location) 
{ 
    //code logic 

    return JsonConvert.SerializeObject(list); 
} 

以外にも、あなたはまだあなたのローカルプロジェクトからアクションGetAllDevicesLocationから正しい結果を得ることができることを確認してください。そしてremote debug your web appに変数responseをトレースして、CreateResponse(JsonConvert.SerializeObject(list))というメソッドがローカルプロジェクトで実行されているように動作するかどうかを確認します。

問題を再現できるサンプルを提供できれば、問題を見つけて解決するのに役立ちます。

関連する問題