2017-07-13 22 views
0

私はJSONを返すWebAPIコントローラを持っています。コードは次のようになります。GetMyOffersメソッドを呼び出すときGET <URL> net :: ERR_CONNECTION_RESET

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Http; 
using Microsoft.AspNetCore.Mvc; 
using GetWork.Data; 
using GetWork.Models.Domain; 
using Microsoft.EntityFrameworkCore; 
using Microsoft.AspNetCore.Cors; 

namespace GetWork.Controllers.Api 
{ 
    [Produces("application/json")] 
    [EnableCors("SiteCorsPolicy")] 
    public class ConversationsApiController : Controller 
    { 
     private readonly ApplicationDbContext _context; 

     public ConversationsApiController(ApplicationDbContext context) 
     { 
      _context = context; 
     } 
     //This one works fine 
     // GET: api/Conversations/5 
     [HttpGet] 
     [Route("api/conversations/getconversations/{id}")] 
     public List<Conversation> GetConversations(int id) 
     { 
      var conversations = _context.Conversations.Include(o => o.Offerer).Where(c => c.JobRelated.ID == id).ToList(); 

      return conversations ?? new List<Conversation>(); 
     } 
     //This one works fine 
     [HttpGet] 
     [Route("api/conversations/getmyoffers/{userId}")] 
     public List<Job> GetMyOffers(string userId) 
     { 
      return _context.Job.Include(c => c.Conversations).ToList(); 

     } 

    } 
} 

、ブラウザで私はこのようなエラーを見ることができます:

GET http://localhost:8377/api/conversations/getMyOffers/70a741c2-b847-4063-ab94-7f2e93860ab6 net::ERR_CONNECTION_RESET 

しかし、私は(_contextをomiting)データをハードコーディングするとき、すべてが正常に動作します。他の方法が働いています。

このような問題を引き起こす原因は何ですか?

UPDATE:

最後に私が見つけた、このようなexpection:

Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'job' with type 'GetWork.Models.Domain.Job' 

私のモデルを確認する必要があります。

SOLUTION:

自己参照ループは、デフォルトでは、シリアライザで扱うことができませんでした。

options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

シリアライズ時に循環参照をすべて無視します。それは私のために働いたが、私はそれが解決策ではなく回避策であることを認識している。 (純粋なモデルの代わりにDTOを使用することを考慮して)。

は、例えば、要求のタイムアウトを増やすことで固定することができる:あなたが_contextを削除し、ちょうどハードコーディングされたデータを返すとき、それが動作する場合

+1

URL **が**動作していて**どちらが**動作していないかを明確にするようにコードを更新できますか? – mjwills

+0

デバッグを試しましたか?それが正確に失敗するかチェックしてください。あなたがMSSQLを持っている場合は、問題がデータベースへの実際のクエリの前に表示されるかどうかを見るためにプロファイリングを試みることができます。他のオプションは、デバッグモードで多くの例外を捕捉するためにチェックされたCLR Exceptionsのデバッグとマーキング中にException Settingsに移動することです。 –

+0

何らかの理由でプロファイリングがうまくいかないのですが、最終的に私は問題の根源を見つけました。 (更新をチェックしてください) –

答えて

0

、私はそれが最も可能性が高いタイムアウトであると思われるでしょう:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 
      .... 
     <aspNetCore requestTimeout="00:20:00" .... /> 
    </system.webServer> 
</configuration> 

あなたは、try catchブロックで_context.Job.Include(c => c.Conversations).ToList(); をラップすることにより、コードの堅牢性を高め、例外が例えばスローされたときに意味のあるものを返すことができます

try { 
    return _context.Job.Include(c => c.Conversations).ToList(); 
} 
catch(Exception ex) { 
    return something meaningful here... 
} 
+0

ありがとうございます。あなたが提供したXMLコードは、私が信じているweb.configファイルに属しています。私はMVC 6を使用していて、appsettings.jsonに全体の設定があるので、私はそれを使用できるかどうかはわかりません。 –

+0

あなたは正しいです、上記の設定はIISであなたのアプリケーションをホストしている場合にのみ適用されます。申し訳ありませんが役に立たない – MikNiller

+0

何とかデフォルトサーバーをIISに変更できますか?私が知る限り、MVC 6はデフォルトでKestrelサーバーを使用し、IISはリバースプロキシとしてのみ使用します。 –

関連する問題