C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C#でWEBサービスプログラム


(過去ログ 113 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■66924 / inTopicNo.1)  C#でWEBサービスプログラム
  
□投稿者/ だいご (1回)-(2013/06/06(Thu) 23:32:33)

分類:[.NET 全般] 


同じ現象が出てる方、いらっしゃいますでしょうか?

VisualStudio2012(C#.NET)+Windows7(PRO,64bit)+IIS7
でWEBサービスのプログラムを作成していますが、WEB側からクラスの配列の結果を返すと
クライアント側では配列0個の結果が返ってきてしまいます。
デバッグでWEB側にアタッチしてみると、下記[※1]のところで1個の配列の結果を
返しているのは確認できているのですが、なぜか[※2]のところで配列0個の結果に
なっています。

因みにプロキシクラスは、WEBサーバプログラムをローカルのIISにデプロイした形で
開発環境からWEB参照で作成しました。

原因が判らずに困っています

--------------------------------------------------------------------------------
WEBサービスから返すカスタムクラス
--------------------------------------------------------------------------------
[Serializable]
public class class_a {
private int vali;
private class_b valb;

public class_a(){ }
public int Vali{ set{ this.vali = value; } get{ return this.vali; }

public class_b get_b(){ }
public bool set_b(int i, string s){ }

private int private_func_x(){ }
}

[Serializable]
public class class_b {
private int vali;
private string vals;

public class_b(){ }
public int Vali{ set{ this.vali = value; } get{ return this.vali; }
public string Vals{ set{ this.vals = value; } get{ return this.vals; }

private int private_func_y(){ }
}

--------------------------------------------------------------------------------
WEBサービス側
--------------------------------------------------------------------------------
[WebMethod]
[XmlInclude(typeof(class_a))]
[XmlInclude(typeof(class_b))]
public class_a[] service_get_a() {
ArrayList list = new ArrayList();
for(/*省略*/){
class_a objA = new class_a();
/*省略*/
list.Add(objA);
}
class_a[] ret = new class_a[list.Count];
for(int i = 0; i < list.Count; ++i){
ret[i] = list[i];
}
return ret; //<--[※1]
}

--------------------------------------------------------------------------------
クライアント側
--------------------------------------------------------------------------------
private void button1_Click(object sender, System.EventArgs e)
{
// Web サービスよりカスタムデータの取得
WSclass_a.Service1 ws = new WSclass_a.Service1();
object[] objA = ws.service_get_a(); //<----[※2]
}


引用返信 編集キー/
■66927 / inTopicNo.2)  Re[1]: C#でWEBサービスプログラム
□投稿者/ WebSurfer (27回)-(2013/06/07(Fri) 11:39:52)
No66924 (だいご さん) に返信
>
> 同じ現象が出てる方、いらっしゃいますでしょうか?

シリアル化/デシリアル化の問題ということはないですか?

内容を詳しく見てなくて全くの思いつきなので違っていたらスミマセン。
引用返信 編集キー/
■66928 / inTopicNo.3)  Re[2]: C#でWEBサービスプログラム
□投稿者/ だいご (2回)-(2013/06/07(Fri) 11:59:40)
No66927 (WebSurfer さん) に返信

メッセージありがとうございます。

WEBサービスでの引数の引き渡しに、シリアライズ、デシリアライズを

自力でコードを書かなければいけないのですか?

自動生成したプロキシクラスを使用すれば、引数・戻り値の受け渡しは

やってくれるのかと思っていましたが・・・
引用返信 編集キー/
■66939 / inTopicNo.4)  Re[3]: C#でWEBサービスプログラム
□投稿者/ WebSurfer (28回)-(2013/06/08(Sat) 10:02:58)
No66928 (だいご さん) に返信
> ■No66927 (WebSurfer さん) に返信
>
> メッセージありがとうございます。
>
> WEBサービスでの引数の引き渡しに、シリアライズ、デシリアライズを
>
> 自力でコードを書かなければいけないのですか?
>
> 自動生成したプロキシクラスを使用すれば、引数・戻り値の受け渡しは
>
> やってくれるのかと思っていましたが・・・

もともとシリアライズできないオブジェクトまでシリアライズはしてくれません。

例えば、System.Data.DataTable を送ろうとすると、シリアル化できないというエラーが出て送ることができません。

(注:Visual Studio のウィザードを使って作る「型付 DataTable」はシリアル化できるようで、それを利用すれば Web サービスから送信でき、受信側でも問題なく「型付 DataTable」を再生して利用できます)
引用返信 編集キー/
■66941 / inTopicNo.5)  Re[1]: C#でWEBサービスプログラム
□投稿者/ 魔界の仮面弁士 (243回)-(2013/06/08(Sat) 14:46:06)
2013/06/08(Sat) 20:13:58 編集(投稿者)

No66924 (だいご さん) に返信
> 同じ現象が出てる方、いらっしゃいますでしょうか?

省略されている部分が多く文法エラーになる上に、
一部、.NET 1.x 世代のようなコーディングも見えるので、
どこまでを実際のコードと信じれば良いのか…。


> VisualStudio2012(C#.NET)+Windows7(PRO,64bit)+IIS7

元のコードだと文法エラーになるので、多少修正しましたが、
VS2010(C#) + Win7(Enterprise,x64) + ASP.NET開発サーバー
で、「Web 参照」してみたところ、問題なく配列を得られています。

http://www.vb-user.net/junk/replySamples/2013.06.08.14.03/Client2010.png
http://www.vb-user.net/junk/replySamples/2013.06.08.14.03/WebService2010.png


VS2012(C#) + Win7(Enterprise,x64) + ASP.NET開発サーバー
にて、「サービス 参照」に切り替えてもみましたが、こちらも
問題は無さそうに見えます。

http://www.vb-user.net/junk/replySamples/2013.06.08.14.03/Client2012.png
http://www.vb-user.net/junk/replySamples/2013.06.08.14.03/WebService2012.png


現象を再現可能な最低限のソースコードを提示できますか?
引用返信 編集キー/
■66944 / inTopicNo.6)  Re[2]: C#でWEBサービスプログラム
□投稿者/ だいご (3回)-(2013/06/10(Mon) 15:35:34)
No66941 (魔界の仮面弁士 さん) に返信

詳しい検証、ありがとうございます。

魔界の仮面弁士さんがお気づきになった通り、元々Ver1.1のソースを4.xにする

のが実際の作業です。

魔界の仮面弁士さんのサンプルの様に、ジェネリックのList<T>クラスにしたい

のですが、元々がArrayListになっていて、大量にあるため

変更がききません。

で、現象を再現可能な最低限のソースコードなのですが、

お出しするのはちょっと難しいかと・・・

自分でも、クライアント/サーバタイプのサンプルプログラムを何本か書いてみたのですが

巧く動いてしまうんですよね。

Ver1.1から4.xにする場合、何が問題なのか・・・

ちなみに、クライアントとサーバがどちらもVisualStudio2012で書かれている場合、

WEBインターフェースにArrayListを使用しているのは問題あるのでしょうか?

片方がJavaだったりすると問題ありなのは理解できるのですが。



> 2013/06/08(Sat) 20:13:58 編集(投稿者)
>
> ■No66924 (だいご さん) に返信
>>同じ現象が出てる方、いらっしゃいますでしょうか?
>
> 省略されている部分が多く文法エラーになる上に、
> 一部、.NET 1.x 世代のようなコーディングも見えるので、
> どこまでを実際のコードと信じれば良いのか…。
>
>
>>VisualStudio2012(C#.NET)+Windows7(PRO,64bit)+IIS7
>
> 元のコードだと文法エラーになるので、多少修正しましたが、
> VS2010(C#) + Win7(Enterprise,x64) + ASP.NET開発サーバー
> で、「Web 参照」してみたところ、問題なく配列を得られています。
>
> http://www.vb-user.net/junk/replySamples/2013.06.08.14.03/Client2010.png
> http://www.vb-user.net/junk/replySamples/2013.06.08.14.03/WebService2010.png
>
>
> VS2012(C#) + Win7(Enterprise,x64) + ASP.NET開発サーバー
> にて、「サービス 参照」に切り替えてもみましたが、こちらも
> 問題は無さそうに見えます。
>
> http://www.vb-user.net/junk/replySamples/2013.06.08.14.03/Client2012.png
> http://www.vb-user.net/junk/replySamples/2013.06.08.14.03/WebService2012.png
>
>
> 現象を再現可能な最低限のソースコードを提示できますか?
引用返信 編集キー/
■66945 / inTopicNo.7)  Re[3]: C#でWEBサービスプログラム
□投稿者/ shu (334回)-(2013/06/10(Mon) 15:47:18)
No66944 (だいご さん) に返信
> で、現象を再現可能な最低限のソースコードなのですが、
>
> お出しするのはちょっと難しいかと・・・
>
> 自分でも、クライアント/サーバタイプのサンプルプログラムを何本か書いてみたのですが
>
> 巧く動いてしまうんですよね。
ということは原因はその提示出来ない部分にあると思いますので、別の観点で探された方がよいと思います。
引用返信 編集キー/
■66946 / inTopicNo.8)  Re[3]: C#でWEBサービスプログラム
□投稿者/ 魔界の仮面弁士 (244回)-(2013/06/10(Mon) 16:47:51)
No66944 (だいご さん) に返信
> 自分でも、クライアント/サーバタイプのサンプルプログラムを何本か書いてみたのですが
> 巧く動いてしまうんですよね。

「Microsoft Network Monitor」や「Fiddler」を使うなどして、
通信内容に変化があるかどうかを調べてみてはいかがでしょう。

http://support.microsoft.com/kb/933741/ja
http://fiddler2.com/
http://bit.ly/h6ePn1
http://j.mp/11sscbC


あとは、クライアント側の「Web 参照」を、いったんすべて削除した上で保存し、
再度作り直してみるとか。(「Web 参照の更新」ではなく)


> WEBインターフェースにArrayListを使用しているのは問題あるのでしょうか?

キャストや Linq の妨げにならないのであれば、List<object> の代わりに
ArrayList を使うのは、まったく問題ないと思います。そもそも、ArrayList を
用いて実験コードを書いてみた限りは、再現しなかったのですよね。

Web サービスのメソッド定義が変更されない限り、
内部実装がどうなっているかは関係ないかと。


> 片方がJavaだったりすると問題ありなのは理解できるのですが。
# 片方が PHP で苦労しました…orz
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -