2009-07-10 7 views
1

まだ利用できないWebサービスのコードをテストしようとしています。私は自分のバージョンをダミーにしようとしています。仕様によると、このように呼び出されます。プロパティを持つWebサービスを作成できますか?

var service = new Service(); 
service.SD = new ServiceData(); 
service.SD.ID = "ABC123"; 
service.SD.Auth = "00000"; 
string result = service.DoMyThing(); 

これは私が得た最も近いものです。

var service = new Service(); 
service.set_SD(new ServiceData()); 
service.get_SD().ID = "ABC123"; 
service.get_SD().Auth = "00000"; 
service.DoMyThing(); 

問題はSDプロパティにあります。 Visual Studio 2008でWeb参照が正しく生成されるように、サービスを作成するにはどうすればよいですか?

私の現在のダミーのWebサービスコードです。

public class Service : System.Web.Services.WebService 
{ 
    // This doesn't show up in the generated proxy at all 
    public static ServiceData SDTest; 

    // For extra credit explain why this needs to be static for it to work 
    private static ServiceData _sd; 
    public ServiceData SD 
    { 
     [WebMethod(EnableSession = true)] 
     get { return _sd; } 
     [WebMethod(EnableSession = true)] 
     set { _sd = value; } 
    } 

    [WebMethod] 
    public string DoMyThing() 
    { 
     // Presumably the real service accesses SD in here 
     return ""; 
    } 
} 

public class ServiceData 
{ 
    public string ID { get; set; } 
    public string Auth { get; set; } 
} 

答えて

1

私はこれでcasperOneと付き合っています。私はfakieプロパティを使用すると便利ですよりも迷惑だと思う。

まだ結婚している場合は、その物件のゲッターを取り除くだけです。あなたはそれを必要としません。代わりに、次の操作を行います。

var service = new Service(); 
ServiceData sd = new ServiceData(); 
sd.ID = "ABC123"; 
sd.Auth = "00000"; 
service.SD = sd; 
string result = service.DoMyThing(); 

のVisual Studioまだ名前setterプロパティ誤っあなたは石鹸の一つは、その名前を変更するために属性を使用することができます。

EDIT:また、SDをSOAPヘッダーとして定義する必要があります。

+0

これは機能しません。 SDプロパティはありません。メソッドパラメータとして "sd"を渡します。 –

+0

いいえ、私はそれが.Netでうまくいくと確信しています。これはカスタムSOAPヘッダーとして送信されます。参照:http://www.codeproject.com/KB/webservices/SOAPHeaderAuthentication.aspx –

+0

カスタムSOAPヘッダーがある場合にのみ機能します。 WSDLによって宣言されていなければなりません。 –

3

デザインに欠陥があります。 Webサービスはプロパティを持つことを目的としていません。 HTTPプロトコルがステートレスである(そしてWebサービスもこれを仮定している)理由だけで、メソッドを公開する必要があります。プロパティを公開することは、インスタンスのすべての呼び出し元に適用する必要がある場合を除いて理にかなっていませんその状況では、それを公開する意味がない)。

代わりに、DoMyThingメソッドにServiceDataのインスタンス(必要な場合)を与え、それを操作して適切な結果セットを返します。

実際にサービスのプロパティを公開する必要がある場合は、パラメータを取らずにサービス情報とともに適切なデータ構造を返すGetPropertiesメソッド(またはそのようなもの)があります。

1

これを行うことはできませんので、「偽造」しないでください。あなたができる最高のものは次のとおりです:

var service = new Service(); 
ServiceData sd = new ServiceData(); 
sd.ID = "ABC123"; 
sd.Auth = "00000"; 
string result = service.DoMyThing(sd); 
0

これは上記の私の浄化されたバージョンよりも仕様をより正確に反映しています( "TypeNameValue"はキーの手がかりでした、ごめんなさい!)。

var service = new Service(); 
service.ServiceDetailsValue = new ServiceDetails(); 
service.ServiceDetailsValue.ID = "ABC123"; 
service.ServiceDetailsValue.Auth = "00000"; 
string result = service.DoMyThing(); 

これは動作するダミーのWebサービスコードです。

using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(Name="TestService", ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class Service : System.Web.Services.WebService 
{ 
    public ServiceDetails SDTest; 

    [WebMethod] 
    [SoapDocumentMethod(Binding = "TestService")] 
    [SoapHeader("SDTest", Required = true)] 
    public string DoMyThing() 
    { 
     return ""; 
    } 
} 

public class ServiceDetails : System.Web.Services.Protocols.SoapHeader 
{ 
    public string ID { get; set; } 
    public string Auth { get; set; } 
} 
+0

サービスにはプロパティがないことに注意してください。別のクラス(ServiceDetails)のインスタンスがプロキシクラスによって割り当てられ、Webサービスコールの前に入力されています。呼び出しが行われると、そのインスタンスはSOAPメッセージの

としてシリアル化されます。サービスは、それを公開フィールドとして読むことができます。 –

関連する問題