■87946 / inTopicNo.7) |
Re[3]: Webサービスからのタグなし項目を取得時の挙動 |
□投稿者/ WebSurfer (1559回)-(2018/07/17(Tue) 14:04:40)
|
■No87943 (雪だるま さん) に返信
> Webサービス側のソースは提供してもらえない。
それが分からないと、ここに書いてあること以外は知り得ない第三者が答えられることは限られて
くると思います。
普通に、Web Service (.asmx) を作って、クライアントアプリでサービス参照を追加して .asmx の
メソッドを呼べば、Web Service のメソッドが null を返せば、クライアント側でも null になるは
ずなのですが・・・
ただ、質問者さんがアップされた WSDL や応答の XML は、自分の環境で自分が考える「普通に」作
ったものとは異なります。
そのあたりの違いが、クライアント側で期待に反して null ではなく 0 (ゼロ) が取得されるという
結果につながっているのではなかろうかと想像してます。(もちろん単なる想像で、確証があるわけ
ではありませんが)
質問者さんが利用している Web Service のメソッドを想像して検証用のコードを作ってみたので、そ
のコードと、それが返す WDSL, 応答 XML を参考にアップしておきます。
自分の環境は、ASP.NET Web Forms アプリ、Windows 10 Pro 64-bit, ローカル IIS、.NET 4.6.1,
Visual Studio Comunity 2015 Update 3 です。
【Web Service】
<%@ WebService Language="C#" Class="NorthwindProductsWebService" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using NorthwindProducts;
using NorthwindProducts.ProductsDataSetTableAdapters;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class NorthwindProductsWebService : System.Web.Services.WebService
{
[WebMethod]
public SampleClass GetSampleClass(string s, long? l1, long? l2, long? l3)
{
return new SampleClass { STR1 = s, LNG1 = l1, LNG2 = l2, LNG3 = l3 };
}
}
[Serializable]
public class SampleClass
{
public string STR1 { get; set; }
public long? LNG1 { get; set; }
public long? LNG2 { get; set; }
public long? LNG3 { get; set; }
}
【WDSL (抜粋)】
<s:element name="GetSampleClass">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="s" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="l1" nillable="true" type="s:long" />
<s:element minOccurs="1" maxOccurs="1" name="l2" nillable="true" type="s:long" />
<s:element minOccurs="1" maxOccurs="1" name="l3" nillable="true" type="s:long" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetSampleClassResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetSampleClassResult" type="tns:SampleClass" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="SampleClass">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="STR1" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="LNG1" nillable="true" type="s:long" />
<s:element minOccurs="1" maxOccurs="1" name="LNG2" nillable="true" type="s:long" />
<s:element minOccurs="1" maxOccurs="1" name="LNG3" nillable="true" type="s:long" />
</s:sequence>
</s:complexType>
【クライアントアプリ】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace ConsoleAppWebService
{
class Program
{
static void Main(string[] args)
{
ServiceReference1.NorthwindProductsWebServiceSoapClient client =
new ServiceReference1.NorthwindProductsWebServiceSoapClient();
sample = client.GetSampleClass(null, null, 2000L, null);
Console.WriteLine("STR1: {0}, LNG1: {1}, LNG2: {2}, LNG3: {3}",
sample.STR1, sample.LNG1, sample.LNG2, sample.LNG3);
}
}
}
【応答 XML】
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetSampleClassResponse xmlns="http://tempuri.org/">
<GetSampleClassResult>
<LNG1 xsi:nil="true" />
<LNG2>2000</LNG2>
<LNG3 xsi:nil="true" />
</GetSampleClassResult>
</GetSampleClassResponse>
</soap:Body>
</soap:Envelope>
|
|