3

私はWCFを初めて使用するので、これはかなり基本的なものだと思います。単一の「注文」オブジェクトが返される簡単な方法があります。デフォルトの XML を使用すると問題なく動作しますが、

ResponseFormat = WebMessageFormat.Json

を返すことができませんJSON。コードは正常に実行され、リターン行にヒットしますが、メソッドはすぐに再度呼び出され、最後にブラウザがlocalhost への接続が中断されたことを示すエラーを返す前に 3 回目の呼び出しが行われます。

を削除するResponseFormat = WebMessageFormat.Jsonと、メソッドが呼び出され、XML が正常に返されます。JSONに欠けているかどうかはわかりません。

IProductSales.cs

namespace ProductsSalesService
{
    [ServiceContract(Name = "ProductsSales")]
    public interface IProductsSales
    {

        [OperationContract]
        [WebGet(UriTemplate = "Orders/{orderID}", ResponseFormat = WebMessageFormat.Json)]
        [Description("Returns the details of an order")]
        SalesOrderHeader GetOrder(string orderID);

    }
}

製品販売

public SalesOrderHeader GetOrder(string orderID)
{
    SalesOrderHeader header = null;

    try
    {
        int id = Convert.ToInt32(orderID);
        AdventureWorksEntities database = new AdventureWorksEntities();

            header = (from order in database.SalesOrderHeaders
                      where order.SalesOrderID == id
                      select order).FirstOrDefault();

    }
    catch
    {
        throw new WebFaultException(HttpStatusCode.BadRequest);
    }

    return header;
}

私は WCF ブックのサンプルに取り組んでいるので、ホストになる小さなコンソール アプリケーションをビルドするように依頼されたので、これがホスト クライアント用の app.config ファイルです。

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="AdventureWorksEntities" connectionString="metadata=res://*/ProductsSalesModel.csdl|res://*/ProductsSalesModel.ssdl|res://*/ProductsSalesModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=BINGBONG;Initial Catalog=AdventureWorks;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><system.serviceModel>
    <services>
      <service name="ProductsSalesService.ProductsSales">
        <endpoint address="http://localhost:8000/Sales" binding="webHttpBinding"
          bindingConfiguration="" name="ProductsSalesService.ProductsSales"
          contract="ProductsSalesService.IProductsSales" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

最後に、これは単なるホスト クライアント コードです。

public class Program
    {
        static void Main(string[] args)
        {
            WebServiceHost host = new WebServiceHost(typeof(ProductsSalesService.ProductsSales));
            host.Open();
            Console.WriteLine("Service running");
            Console.WriteLine("Press ENTER to stop the service");
            Console.ReadLine();
            host.Close();
        }
    }

そのhttp://localhost:8000/Sales/Orders/43659ため、注文を取得しようとすると、3 回ヒットし、ページが Chrome でキャンセルされ、次のエラーが表示されます。

この Web ページは利用できません localhost への接続が中断されました。いくつかの提案があります: この Web ページを後でリロードします。インターネット接続を確認してください。使用しているルーター、モデム、またはその他のネットワーク デバイスを再起動します。ファイアウォールまたはウイルス対策ソフトウェアの設定で、許可されたプログラムとして Google Chrome を追加します。既に許可されているプログラムである場合は、許可されたプログラムのリストから削除し、再度追加してみてください。プロキシ サーバーを使用している場合は、プロキシ設定を確認するか、ネットワーク管理者に問い合わせて、プロキシ サーバーが機能していることを確認してください。プロキシ サーバーを使用する必要がないと思われる場合は、プロキシ設定を調整してください。ツール メニュー > [設定] > [詳細設定を表示...] > [プロキシ設定を変更...] に移動します。

LAN 設定を開き、[LAN にプロキシ サーバーを使用する] チェックボックスの選択を解除します。エラー 101 (net::ERR_CONNECTION_RESET): 接続がリセットされました。

私がWebMessageFormat.Jsonすべてを削除すると、正常に動作します!

ご協力ありがとうございます。

4

3 に答える 3

5

手始めに、WCF のトレース/ログ記録を試して、問題が明らかになるかどうかを確認してください。

これをサーバーの構成ファイル (<configuration>要素内のどこかに) に入れてください:-

<system.diagnostics>
 <sources>
  <source name="System.ServiceModel" switchValue="Error" propagateActivity="true">
    <listeners>
      <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\Temp\server.svclog"/>
    </listeners>
  </source>
  <source name="System.ServiceModel.MessageLogging">
    <listeners>
      <add name="messages"
      type="System.Diagnostics.XmlWriterTraceListener"
      initializeData="C:\Temp\server_messages.svclog" />
    </listeners>
  </source>
 </sources>
</system.diagnostics>

そして、これを<system.serviceModel>要素の中に入れます:-

<diagnostics>
  <messageLogging
       logEntireMessage="true"
       logMalformedMessages="false"
       logMessagesAtServiceLevel="true"
       logMessagesAtTransportLevel="false"
       maxMessagesToLog="3000"
       maxSizeOfMessageToLog="2000"/>
</diagnostics>

もう一度サービスにアクセスして、これが生成する .svclog ファイルを調べて (できれば) 手がかりを得てください。ファイルは「サービス トレース ビューアー」ツールで開きます。そうでない場合は、MS からダウンロードできます (Win SDK の一部だと思います)。

于 2012-06-13T13:59:08.000 に答える
1

私の障害は実際には関係ありませんが、これは、サービスが失敗し、接続が中断されたというエラーが表示されたという問題を調べたときに最初に見つけた記事です。

私の欠点は、WebGetメソッドから出力していたクラスにDataContract属性を持つプロパティがあったが、それぞれにアクセサーを追加していなかったという事実に関係していましたSet(それらを出力のみと見なしたため、要点がわかりませんでした) .

構成ファイルにトレースを追加すると、障害はアクセサーがないことがすぐに明らかになったので、各プロパティにアクセサーSetを追加したところ、すべてが期待どおりに機能するようになりました。private setDataContract

他の誰かが同じ検索パスをたどり、同じ問題を抱えている場合に備えて、ここに追加しました

于 2015-11-22T11:40:31.420 に答える
0

このコード行は、構成を考慮せずに Service Host を構築するため、Service はありますが、別の URL をリッスンします。

WebServiceHost host = new WebServiceHost(typeof(ProductsSalesService.ProductsSales));

以下のベース アドレスnew WebServiceHostとコードを追加します。

    WebChannelFactory<ProductsSalesService.IProductsSales> cf = 
    new WebChannelFactory<ProductsSalesService.IProductsSales>("ProductsSalesService.ProductsSales");
ProductsSalesService.IProductsSales channel = cf.CreateChannel();

ここで完全なコードを参照してください - http://msdn.microsoft.com/en-us/library/bb919583

于 2012-06-13T14:22:16.850 に答える