質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

WCFサービス間のJSONを利用したPOST通信でエラー415が発生する。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 254

REV_Creator

score 0

前提・実現したいこと

C#にてjsonのデータをPostで送信するWCFサービスA、
WCFサービスAからPOSTで送られてきたjsonのデータを受信する
WCFサービスBを作成しています。

WCFサービスAから送ったjsonのデータをもとに、WCFサービスBで処理を実行し、
WCFサービスBからサービスAにjsonの文字列を返す
ということが行いたいです。

発生している問題・エラーメッセージ

現在作成したWCFサービスに対して、
webClient.UploadString(WCFサービスBのuri,"POST",jsonの文字列)
で実行を行った際に

リモートサーバーがエラーを返しました:(415) Cannot Process the message because the content type 'application/octet-stream' was not the expected type 'multipart/related; type="application/xop+xml"'.

のエラーが発生します。
また該当の.svcファイルをブラウザーで表示した場合には
HTTP 400 正しくない要求
Webページが見つかりません
が発生します。

対処法をどなたか教えていただけませんでしょうか?

該当のソースコード

ネットに接続できないPCのソースを見ながら打ってるので若干ミスがあるかもしれません。
(後インデントが省略気味です)
またクラス名や一部メソッド名は都合上変更してあります。

WCFサービスAから呼ばれているクラスXXXA.csの中身
Public Class XXXXA
{
 //送信箇所
 private string PostForService(string serviceName, string jsonContent)
 {
   var webClient = new WebClient();

   var uri = new Uri(serviceName);

   webClient.Headers["HttpRequestHeader.ContentType"] = "application/Json";
   webClient.Headers["HttpRequestHeader.Accept"] = "application/Json";
   webClient.Encoding = Encoding.UTF8;

   // ここでエラー発生
   // uriの内容:http://localhost:50080/TestAccess/TestService.svc/JsonTest
   // jsonContentの内容:{"品種ID":"ITEMID00001_1"}
   var response = webClient.UploadString(uri, "POST", jsonContent);

   return response;
 }
}

//TestService.svcの中身(マークアップ)
<%@ ServiceHost Language="C#" Debug="true" Service="AAAA.BBBB.WCFServiceForB.TestAccess.TestService" CodeBehind="TestService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory")

//TestService.svc.csの中身
Public Class TestService : Interface.ITestService
{
 //受信側
 public string JsonTest(string jsonContent)
 {
   //疎通確認がしたい段階なので現在はまだ中身なし
   var ret = "";
   return ret;
 }
}

//ITestService.csの中身
[OperationContract]
[WebInvoke(Method = "POST",
     RequestFormat = WebMessageFormat.Json
     ResponseFormat = WebMessageFormat.Json
     UriTemplate = "JsonTest"
     BodyStyle = WebMessageBodyStyle.Wrapped
)]
string JsonTest(string jsonContent);

//WCFサービスBWeb.Configの一部(関係してそうな箇所)
//(手打ちなので一部のみ)

<system.serviceModel>
 <services>
  <service name="AAAA.BBBB.WcfServiceForB.TestAccess.TestService">
  <endpoint address="TestService"
    binding="webHttpBinding" behaviorConfiguration="web" contract="AAAA.BBBB.WcfServiceForB.TestAccess.Interface.ITestService"/>
    <endpoint address=""
    binding="basicHttpBinding" contract="AAAA.BBBB.WcfServiceForB.TestAccess.Interface.ITestService"/>
  </service>
</services>
 <bindings>
  <basicHttpBinding>
   <binding messageEncoding="Mtom"
            maxBufferPoolSize="2147473647"
            maxBufferSize="2147473647"
            maxReceivedMessageSize="2147473647" >
   <readerQuotas maxDepth="64" maxStringContentLength="2147473647" maxArrayLength="2147473647" maxBytesPerRead="2147473647" maxNameTableCharCount="2147473647" />
   </binding>
  </basicHttpBinding>
  </bindings>
  <behaviors>
  <endpointBehaviors>
   <behavior name="web">
    <webHttp />
   <behavior>
   </endpointBehaviors>
   <serviceBehaviors>
    <behavior>
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
     <dataContractSerializer maxItemsInObjectGraph="10000000" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <serviceHostingEnviroment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
   <modules runAllManagedModulesForAllRequests="true" />
   <directoryBrowse enabled="true" />
  </system.webServer>

試したこと

検索した結果、
最初はマークアップにFactory="System.ServiceModel.Activation.WebServiceHostFactory"がなかったので、追加した。
(ただし問題は解決せず)

補足情報(FW/ツールのバージョンなど)

・VisualStudio 2010
・.NetFramework 4.0
・C#

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2020/07/12 09:41 編集

    もっと情報提供して、さらに質問者さんの方である程度切り分けしてもらわないと、答えを得るのは難しそうです。

    (1) WCF サービスはどのようにホストされているのか?

    (2) 開発環境はどうなっているのか? 開発マシンのローカル IIS 上の ASP.NET でホストされている WCF にアクセスしている? アクセスしているアプリは何?

    (3) WCFサービスA の問題なのか WCFサービスB の問題なのか切り分けできているのか?

    (4) WCFサービスB は JSON を POST で受けて JSON を返すということのようだが、そもそもちゃんと作られているのか? エラーメッセージ Cannot Process the message because the content type 'application/octet-stream' was not the expected type 'multipart/related; type="application/xop+xml"'. を見るとそうではなさそうだが。

    > また該当の.svcファイルをブラウザーで表示した場合には HTTP 400 正しくない要求 Webページが見つかりません

    (5) 400 は Bad Request です(例えば、JSON を POST する際 contentType: "application/json; charset=utf-8" の設定がないときに出ます)。見つからないというのは 404 になるはず。こういうところからも質問文に書いてあることの信ぴょう性が疑われるのですが・・・

    キャンセル

回答 2

check解決した方法

0

そもそもJSON絡みの情報が少ないので、こちらで質問しましたが、質問の回答者から設定周りに不備がないことは分かったので、環境面を調べてるうちに自己解決しました。
一応自己解決の手順を

1.svcを利用してJSONに対して接続していたが、RESTサービスを作りかつ、URLをはらないと接続できず、svc経由でのJSONリクエストはそもそも不可能。
(出来るかな?という仮定の話はよく出てきますが実際にやった人は過去に確認できなかったので、おそらく不可能なのでしょう)

2.400になっていたのはVS2010の不具合。過去のパッチを何とか入手して当てたら正常に動作するようになった(ASP.net4.0のIISExpressの動作環境が動いていなかった)

以上です。
ご協力ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

質問者さんが無反応で、このスレッドはもう放棄してしまったのかもしれませんが、とりあえず回答欄に書いておきます。フィードバックがなければこれで終わりにします。

質問のコメントに書いたことの繰り返しですが、

(1) WCF サービスはどのようにホストされているのか?

(2) 開発環境はどうなっているのか? 開発マシンのローカル IIS 上の ASP.NET でホストされている WCF にアクセスしている? アクセスしているアプリは何?

(3) WCFサービスA の問題なのか WCFサービスB の問題なのか切り分けできているのか?

(4) WCFサービスB は JSON を POST で受けて JSON を返すということのようだが、そもそもちゃんと作られているのか? エラーメッセージ Cannot Process the message because the content type 'application/octet-stream' was not the expected type 'multipart/related; type="application/xop+xml"'. を見るとそうではなさそうだが。

また該当の.svcファイルをブラウザーで表示した場合には HTTP 400 正しくない要求 Webページが見つかりません

(5) 400 は Bad Request です(例えば、JSON を POST する際 contentType: "application/json; charset=utf-8" の設定がないときに出ます)。見つからないというのは 404 になるはず。

・・・と、いろいろ不明点が多いですが、怪しいのは「WCFサービスB」がちゃんとできてないということだと想像してます。

JSON を送信して JSON を応答として返す WCF サービスは、自分が知る限りですが、ウィザードを使って何も考えずに作成できるようなものではないようです。以下の記事を見てください。結構いろいろ面倒でした。

WCF と jQuery AJAX
http://surferonwww.info/BlogEngine/post/2015/10/15/wcf-and-jquery-ajax.aspx

このあたりはどうなのでしょうか? 一度、上記の記事を参考に JSON を受け渡す簡単な WCF サンプルアプリを作って、それが動くかどうか試してみることをお勧めしたいです。

あと、今回の問題とは関係ないかもしれませんが、以下のようなこともありました。ご参考まで。 

WCF サービスで HTTP 404.17 エラー
http://surferonwww.info/BlogEngine/post/2017/02/05/wcf-servce-hosted-by-aspnet-returns-http-404-17-error.aspx

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る