WCF - (504) サーバーはこの要求に対する応答を返しませんでした
-
23-09-2019 - |
質問
JSONP WCF エンドポイントを持っており、504 エラーが発生する理由を追跡しようとしています。
HTTP/1.1 504 Fiddler - 受信失敗
コンテンツタイプ:テキスト/html
繋がり:近い
タイムスタンプ:11:45:45:9580
ReadResponse() が失敗しました:サーバーはこのリクエストに対する応答を返しませんでした。
エンドポイント内の任意の場所にブレークポイントを設定し、コードをステップ実行して、応答に必要なデータが正常に収集されていることを確認し、コードの最終行に到達すると、WCF 呼び出しから抜け出すとすぐに 504 エラーが発生します。 これは先週うまくいきました!
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract(Name = "NegotiateService", Namespace = "http://rivworks.com/Services/2009/01/15")]
public class NegotiateService //: svcContracts.INegotiateService
{
public NegotiateService() { }
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public dataObjects.NegotiateSetup GetSetup(string method, string jsonInput)
{
dataObjects.NegotiateSetup resultSet = new dataObjects.NegotiateSetup();
using (RivFeedsEntities1 _dbFeed = new FeedStoreReadOnly(AppSettings.FeedAutosEntities_connString, "", "").ReadOnlyEntities())
{
using (RivEntities _dbRiv = new RivWorksStore(AppSettings.RivWorkEntities_connString, "", "").NegotiationEntities())
{
// Deserialize the input and get all the data we need...
Newtonsoft.Json.Linq.JObject o = Newtonsoft.Json.Linq.JObject.Parse(jsonInput);
string urlRef = String.Format("{0}", o["ref"]).Replace("\"", "");
string clientDate = String.Format("{0}", o["dt"]).Replace("\"", "");
string ProductID = String.Format("({0})", o["productId"]).Replace("\"", "");
string SKU = String.Format("{0}", o["sku"]).Replace("\"", "");
string env = String.Format("{0}", o["env"]).Replace("\"", "");
IList<Product> efProductList = null;
Product workingProduct = null;
vwCompanyDetails workingCompany = null;
bool foundItem = false;
if (!String.IsNullOrEmpty(SKU))
efProductList = _dbRiv.Product.Include("Company").Where(a => a.SKU == SKU).ToList();
else if (!String.IsNullOrEmpty(ProductID))
efProductList = _dbRiv.Product.Include("Company").Where(a => a.ProductId == new Guid(ProductID)).ToList();
foreach (Product product in efProductList)
{
if (String.IsNullOrEmpty(product.URLDomain))
{
var efCompany = _dbRiv.vwCompanyDetails
.Where(a => a.defaultURLDomain != null && a.CompanyId == product.Company.CompanyId)
.FirstOrDefault();
if (efCompany != null && urlRef.Contains(efCompany.defaultURLDomain))
{
foundItem = true;
workingProduct = product;
workingCompany = efCompany;
}
}
else
{
if (urlRef.Contains(product.URLDomain))
{
foundItem = true;
workingProduct = product;
workingCompany = _dbRiv.vwCompanyDetails
.Where(a => a.CompanyId == product.Company.CompanyId)
.FirstOrDefault();
}
}
}
if (foundItem)
{
try
{
// Update the resultSet...
if (workingProduct != null && workingCompany != null)
{
string rootUrl = String.Empty;
try
{
rootUrl = AppSettings.RootUrl;
}
catch
{
rootUrl = env + @"/";
}
resultSet.button = workingProduct.ButtonConfig;
resultSet.swfSource = String.Format(@"{0}flash/negotiationPlayer.swf", rootUrl);
resultSet.gateway = rootUrl;
resultSet.productID = workingProduct.ProductId.ToString();
resultSet.buttonPositionCSS = workingProduct.buttonPositionCSS;
}
}
catch (Exception ex)
{
log.WriteLine(" ERROR: ", ex.Message);
log.WriteLine("STACK TRACE: ", ex.StackTrace);
}
}
}
}
return resultSet;
}
}
私のweb.config:
<!-- WCF configuration -->
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="JsonpServiceBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="RivWorks.Web.Service.NegotiateService">
<endpoint address=""
binding="customBinding"
bindingConfiguration="jsonpBinding"
behaviorConfiguration="JsonpServiceBehavior"
contract="RivWorks.Web.Service.NegotiateService" />
</service>
</services>
<extensions>
<bindingElementExtensions>
<add name="jsonpMessageEncoding" type="RivWorks.Web.Service.JSONPBindingExtension, RivWorks.Web.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
<bindings>
<customBinding>
<binding name="jsonpBinding" >
<jsonpMessageEncoding />
<httpTransport manualAddressing="true"/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
前述したように、コードは最後まで実行されるため、応答が送信されない理由を理解しようとしています。
解決 3
。ウェブサービスであること、それはウェブサイトのconfigファイルから引っ張っていませんでした。 (ハードコーディング)魔法の少しで最終的にアクティブにするために、私はコンテキストを持って、システムが作業を開始しました。ない完全にこの〜504まだ私が今まで飛び出る他の根本的な誤りを持っているように - 。私はそれを把握するように、この答えを継続していきます。
2010年2月1日 - 私は、接続文字列のエラーをクリアしたら、私は非常に迅速にクリーンアップされたカップルの基本的なEFエラーを見つけました。それは、今再び起動されます。
他のヒント
私はあなたのための直接的な解決策を持っていない申し訳ありませんが、しかし、WCF関連の問題追いかけたとき、私はその後に、ログの上に行く、シナリオを実行し、WCFのトレースログをオンにすることを発見しましたSvcTraceViewer.exeができます...あなたは物事があなたに壊している可能性があるスタックにいくつかの可視性を取得します。
あなたは「 WCFサービス構成エディターの」ターンにを使用することができます様々なログ設定とレベルのオン/オフます。
同様の問題が発生したところですが、それを特定する唯一の方法はトレースでした(すでに@Tylerによって提案されているように)。また、サーバーから HTTP 504 が返され、Visual Studio でサービスをデバッグしました 例外は表示されませんでした. 。実際、デバッガーから見ると、サービスが適切に応答を返しているように見えました。
私の特定のケースでは、データ コントラクト クラスのメンバーの 1 つが enum 型であり、値が EnumMemberAttribute でマークされていないことがエラーの原因でした。
WCF でのトレースの構成について詳しくは、こちらをご覧ください。 ここ WCF サービス データ コントラクトの列挙型について ここ.
同じ問題が数回発生しました。
1つのシナリオでは、公共財産の1つ(Datamember)にはGetterとSetterのみがありませんでした。そのデータメンバーを変更して、ゲッターとセッターの両方に問題を解決しました。
別のシナリオでは、EF4 POCO (Navigation プロパティが設定されている) を JSON との間でシリアル化/逆シリアル化していましたが、これにより逆シリアル化中に再帰ループが発生しました。POCO の属性を次のように変更します。
[DataContract(IsReference = true)]
再帰ループの問題の解決には役立ちましたが、DataContractJsonSerializer は参照をサポートしていないため、形式を XML に切り替える必要がありました。(追伸 - WEB API の場合、デフォルトの JSON シリアライザーは JSON.NET となり、問題なく参照を処理できます)。
ヒント: 他の人が示唆したように、 WCF トレース ログ 504 エラーを解決するあなたの友達です。
うまくいけば、これは誰かに役立ちます。私はJSONを返すWCFのRESTサービスを持っていたし、シオマネキは私に504を与えていた、ReadResponse()が失敗しました:サーバーは、この要求に対する応答が返されませんでした。
。私の問題は、私はこのようなモデル戻ったということでした。
をpublic class ServerResult
{
public StatusCode Status { get; set; }
public object Data { get; set; }
public static ServerResult CreateServerResult(StatusCode status)
{
return new ServerResult() { Status = status };
}
public static ServerResult CreateServerResult(StatusCode status, object data)
{
return new ServerResult() { Data = data, Status = status };
}
}
とWCFは、オブジェクトをエンコードする方法を理解していないようです。私は戻ったオブジェクトは完全に罰金だけで文字列とint型でした。私は仕事にそれのために、これに応答を変更しなければならなかった。
public class ServerResult<T>
{
public StatusCode Status { get; set; }
public T Data { get; set; }
public static ServerResult<T> CreateServerResult(StatusCode status)
{
return new ServerResult<T>() { Status = status };
}
public static ServerResult<T> CreateServerResult(StatusCode status, T data)
{
return new ServerResult<T>() { Data = data, Status = status };
}
}
は同じ問題を抱えていた上記odythとしてsenario。私のケースでは、フィドラーによって504応答が生じたか、RESPONSクラスのDateTime
あったかNULL
属性でした。 NULL
文字列の属性を持つ問題はありません。
public class Brevutskick
{
public string DocumentCode { get; set; }
public string DocumentName { get; set; }
public string Status { get; set; }
public DateTime DateCreated { get; set; }
public string DataTemplate { get; set; }
}
、私は、Web APIからEntity Frameworkの4 `EntityObject」のリストを返すようにしようと、このに走りました。それを修正するために、私はちょうどEntityObjectをシリアル化します。
好きではないので、それは、明示的な選択を行う製return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
p.Id,
p.Name,
p.CreateDate
}));