1

WCFサービス(json REST)を作成していますが、wcftestclient.exeを使用すると正常に動作します。

そのテストツールを実行すると、デバッグ中にブレークポイントがトリガーされ、すべてが期待どおりに機能します。

ただし、ブラウザを使用してサービスとメソッドに移動する場合、ブレークポイントはトリガーされません。リクエストがコードに到達していないようです。

Webブラウザーを使用してサービスに移動してもエラーは発生しません。データが取得されないか、ブレークポイントがトリガーされます。

これが重複している場合はお詫びします。同様の質問への回答にある多くの異なる構成を読んで試しましたが、何も機能していないようです。

助けてくれてありがとう、私は以下に私のコードを投稿しました。

マーティン

設定しました:ServiceContract

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
List<Country> GetAllCountries();

サービスクラス:

    public List<Country> GetAllCountries()
    {
        ControlServiceRepository rep = new ControlServiceRepository();
        return rep.GetAllCountries().ToList() ;
    }

と私のウェブ設定

<system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="OmniData" behaviorConfiguration="ServiceConfig">
        <!-- Service Endpoints -->
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:55641/"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract="ControlService.IOmniData" behaviorConfiguration="rest" />
      </service>
    </services>
      <behaviors>
        <endpointBehaviors>
          <behavior name="rest">
            <webHttp helpEnabled="true"/>
          </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
          <behavior name="ServiceConfig">
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="false"/>
          </behavior>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" defaultOutgoingResponseFormat="Json"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
4

2 に答える 2

2

契約内容に不備があると思います

[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/GetAllCountries", RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
List<Country> GetAllCountries();

これを試してみてください。役立つかどうか教えてください。

于 2012-11-12T21:15:44.093 に答える
1

構成内のすべてのエンドポイントを削除して使用することで、最終的にこれが機能するようになりました

RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(OmniData)));

他の誰かが問題を抱えている場合、クラス自体の中で応答のタイプとエンドポイントを指定するだけでよいため、エンドポイントを設定するよりも簡単です。

それで:

global.asax が存在する場合は追加し、これを含めます。

protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(OmniData)));
        }

あなたのサービスクラスを飾ります

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

これが私のものです:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class OmniData : IOmniData
{
  public Country[] GetAllCountries()
  {
    ControlServiceRepository rep = new ControlServiceRepository();
    return rep.GetAllCountries().ToArray() ;
  }
}

次に、WebGet または WebInvoke を使用してエンドポインとタイプを設定するインターフェイス

public interface IOmniData
    {
        [OperationContract]
        [WebGet(UriTemplate = "OmniData/GetAllCountries", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
        Country[] GetAllCountries();
    }

UriTemplate はエンド ポイントであるため、使用するメソッドにアクセスするには、http: //MyService.com/OmniData/GetAllCountriesを使用します。

そして最後に、Web設定

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false"/>
      </webHttpEndpoint>
    </standardEndpoints>
    <services>
      <service name="OmniData">
        <!-- Service Endpoints -->
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:55641"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract="ControlService.IOmniData" behaviorConfiguration="rest" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="rest">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

ここからの多くの助け

しかし、重要なことに、json の結果については、確認する必要があります。automaticFormatSelectionEnabled="false" がそこにあるため、インターフェイスで指定された応答形式が使用されます。それ以外の場合は、代わりに XML になります。

うまくいけば、これは他の誰かを助ける

そして、再びフィドラーに感謝します!

マーティン

于 2012-11-13T11:43:12.970 に答える