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

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

新規登録して質問してみよう
ただいま回答率
85.36%
WCF

WCFは、.NET Frameworkの提供する機能の一つ。サービス指向アプリケーション構築のためのフレームワークです。ネットワークを通して、異なるコンピュータ上で動くソフトウェア間の通信が可能になります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

2回答

3503閲覧

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

REV_Creator

総合スコア0

WCF

WCFは、.NET Frameworkの提供する機能の一つ。サービス指向アプリケーション構築のためのフレームワークです。ネットワークを通して、異なるコンピュータ上で動くソフトウェア間の通信が可能になります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

0グッド

0クリップ

投稿2020/07/11 15:55

前提・実現したいこと

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のソースを見ながら打ってるので若干ミスがあるかもしれません。
(後インデントが省略気味です)
またクラス名や一部メソッド名は都合上変更してあります。

C#

1 2WCFサービスAから呼ばれているクラスXXXA.csの中身 3Public Class XXXXA 4{ 5 //送信箇所 6 private string PostForService(string serviceName, string jsonContent) 7 { 8 var webClient = new WebClient(); 9 10 var uri = new Uri(serviceName); 11 12 webClient.Headers["HttpRequestHeader.ContentType"] = "application/Json"; 13 webClient.Headers["HttpRequestHeader.Accept"] = "application/Json"; 14 webClient.Encoding = Encoding.UTF8; 15 16 // ここでエラー発生 17 // uriの内容:http://localhost:50080/TestAccess/TestService.svc/JsonTest 18 // jsonContentの内容:{"品種ID":"ITEMID00001_1"} 19 var response = webClient.UploadString(uri, "POST", jsonContent); 20 21 return response; 22 } 23} 24 25//TestService.svcの中身(マークアップ) 26<%@ ServiceHost Language="C#" Debug="true" Service="AAAA.BBBB.WCFServiceForB.TestAccess.TestService" CodeBehind="TestService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory") 27 28//TestService.svc.csの中身 29Public Class TestService : Interface.ITestService 30{ 31 //受信側 32 public string JsonTest(string jsonContent) 33 { 34 //疎通確認がしたい段階なので現在はまだ中身なし 35 var ret = ""; 36 return ret; 37 } 38} 39 40//ITestService.csの中身 41[OperationContract] 42[WebInvoke(Method = "POST", 43 RequestFormat = WebMessageFormat.Json 44 ResponseFormat = WebMessageFormat.Json 45 UriTemplate = "JsonTest" 46 BodyStyle = WebMessageBodyStyle.Wrapped 47)] 48string JsonTest(string jsonContent); 49 50//WCFサービスBのWeb.Configの一部(関係してそうな箇所) 51//(手打ちなので一部のみ) 52 53<system.serviceModel> 54 <services> 55 <service name="AAAA.BBBB.WcfServiceForB.TestAccess.TestService"> 56 <endpoint address="TestService" 57 binding="webHttpBinding" behaviorConfiguration="web" contract="AAAA.BBBB.WcfServiceForB.TestAccess.Interface.ITestService"/> 58 <endpoint address="" 59 binding="basicHttpBinding" contract="AAAA.BBBB.WcfServiceForB.TestAccess.Interface.ITestService"/> 60 </service> 61</services> 62 <bindings> 63 <basicHttpBinding> 64 <binding messageEncoding="Mtom" 65 maxBufferPoolSize="2147473647" 66 maxBufferSize="2147473647" 67 maxReceivedMessageSize="2147473647" > 68 <readerQuotas maxDepth="64" maxStringContentLength="2147473647" maxArrayLength="2147473647" maxBytesPerRead="2147473647" maxNameTableCharCount="2147473647" /> 69 </binding> 70 </basicHttpBinding> 71 </bindings> 72 <behaviors> 73 <endpointBehaviors> 74 <behavior name="web"> 75 <webHttp /> 76 <behavior> 77 </endpointBehaviors> 78 <serviceBehaviors> 79 <behavior> 80 <serviceMetadata httpGetEnabled="true" /> 81 <serviceDebug includeExceptionDetailInFaults="false" /> 82 <dataContractSerializer maxItemsInObjectGraph="10000000" /> 83 </behavior> 84 </serviceBehaviors> 85 </behaviors> 86 <serviceHostingEnviroment multipleSiteBindingsEnabled="true" /> 87 </system.serviceModel> 88 <system.webServer> 89 <modules runAllManagedModulesForAllRequests="true" /> 90 <directoryBrowse enabled="true" /> 91 </system.webServer> 92

試したこと

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

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

・VisualStudio 2010
・.NetFramework 4.0
・C#

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/12 00:46 編集

もっと情報提供して、さらに質問者さんの方である程度切り分けしてもらわないと、答えを得るのは難しそうです。 (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 になるはず。こういうところからも質問文に書いてあることの信ぴょう性が疑われるのですが・・・
guest

回答2

0

自己解決

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

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

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

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

投稿2020/07/14 00:34

REV_Creator

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

投稿2020/07/12 10:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問