web-dev-qa-db-ja.com

IISホストされているWCFサービスがHTTP 400 Bad Requestを返す

私は何時間も探していましたが、解決策を見つけることができませんでした。簡単に説明します。

WCFサービスについて学習しています。サービスを作成して閲覧しました。これが設定ファイルです:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmployeeServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="EmployeeServiceBehaviour" name="EmployeeConfiguration">
        <endpoint address="http://localhost:2005/EmployeeService.svc" binding="basicHttpBinding"
          bindingConfiguration="" contract="IEmployeeConfiguration" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.webServer>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Visual Studioから閲覧すると問題ないようです。それは完全に動作します。

enter image description here

enter image description here

次に、IISで公開しようとしています。私がやっていることはこれです:

サービスをフォルダーに公開し、このサービスをIISに追加します。

enter image description here

ポートとしてポート3006を選択します。

その構成ファイルの下。構成内のポートも3006に変更したことに注意してください

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmployeeServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="EmployeeServiceBehaviour" name="EmployeeConfiguration">
        <endpoint address="http://localhost:3006/EmployeeService.svc" binding="basicHttpBinding"
          bindingConfiguration="" contract="IEmployeeConfiguration" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <compilation/>
  </system.web>
  <system.webServer>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

そして私はスムーズに走るのを待っていますが: enter image description here

enter image description here

IISでChromeから空白ページが表示される

enter image description here

そして、エクスプローラからのHTTP 400 Bad Request

enter image description here

最後に、構成ファイルからアドレス部分を削除すると、すべてがうまく機能します。しかし、他の混乱しているのは、上記のシナリオ(アドレスが提供された)の後の他のコンピューターでサービスにアクセスできることです。それで、なぜこれが1つのコンピューターで機能し、別のコンピューターでは機能しないのかを検索するのに本当にうんざりしました。誰かが私にそれを説明できますか?

もう少し長いのはわかっていますが、はっきりと説明する必要があります。ありがとう

12
Omer K

私の検索によると、私は住所を提供すべきではありません。

msdn.Microsoft.com/en-us/library/aa751792(v=vs.110).aspx

IISがホストするサービスエンドポイントには、常に相対エンドポイントアドレスを使用する必要があります。完全修飾エンドポイントアドレス(たとえば、localhost/MyService.svc)を指定すると、エンドポイントアドレスがエンドポイントを公開するサービスをホストするIISアプリケーションを指さない場合、サービスのデプロイメントでエラーが発生する可能性があります。ホステッドサービスに相対エンドポイントアドレスを使用すると、これらの潜在的な競合を回避できます。

6
Omer K

これは助けになるかもしれません。私はこれを機能させるために2時間以上費やしました。私はFFとそのセットをデフォルトのブラウザーとして使用します。

fFでは、URLの末尾に/が追加されていました

http://services.tester.dev/VehicleFeedService.svc/

これはNetworkError: 400 Bad Requestを返しました

ただし、IEまたはchromeでは、末尾に/を付けず、正常に動作します。

注意すべきこと.. FFで400の悪いリクエストを出していたとしても、?wdslは機能しました

http://services.tester.dev/VehicleFeedService.svc?wsdl

/が問題を引き起こしていたようです

1
JGilmartin

これで問題が解決すると思います:

このエンドポイントをサービスに追加します。

<endpoint address="mex" binding="mexHttpBinding" 
    bindingConfiguration="" contract="IMetadataExchange" />

そして、nameservice属性をサービスクラスのフルネームに変更します。

<service behaviorConfiguration="EmployeeServiceBehaviour" 
    name="Namespace.EmployeeConfigurationClass">

それで十分だと思います

1
Alireza

あなたはフィドラーを試すこともできますし、その上に多くのデバッグ情報を与える可能性があるsvcTracerを試すこともできますincludeExceptionDetailInFaults=trueサーバー上でフラグを立てますが、クライアントが外部エンティティの場合は、この情報をクライアントに特別に送信することが常に適切であるとは限らないことを示すことが重要です。この警告と共に、以下はそれを使用する方法のヒントです。

<serviceBehaviors>
    <behavior name="ServiceBehavior">
    ....
        <serviceDebug includeExceptionDetailInFaults="true" />
    ....
    </behavior>
</serviceBehaviors>

幸せなデバッグ:)

0
Mubashar