3

curlコマンド ライン ツールを使用して、複数のパラメーターを持つ WCF サービスに投稿するにはどうすればよいですか?

次のようなサービスがあります

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]
    void PostMethod(string varString, bool varBool);
}

そして、私はこのようにサーバーをセットアップしました

var service = new WebServiceHost(typeof(MyService),
    new Uri("http://localhost:3000/MyService");
service.AddServiceEndpoint(typeof(IMyService), new WebHttpBinding(), "");
service.Open();

curl 経由でこのメソッドを呼び出すにはどうすればよいですか?

curl -d varString=foo -d varBool=true http://localhost:3000/MyService/PostMethod

エラーはどこにありますか? メソッドの BodyStyle が間違っていませんか? 次のように [DataContract] クラスでパラメーターをラップする必要がありますか?

[DataContract]
public class PostMethodResult
{
    [DataMember]
    public string varString { get; set; }

    [DataMember]
    public bool varBool { get; set; }
}
4

1 に答える 1

1

改訂された回答:

curlを使用してWebサービスにリクエストを送信する場合、URIテンプレートは機能しません。WebInvokeは、POST本文がXMLまたはJSONのいずれかであることを想定しています。

2つのパラメーターがあるため、WebMessageBodyStyle.Bareは機能せず、ラップする必要があります。

[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]
string PostMethod(string varString, bool varBool); 

ポスト本体の形状は次のようになります。

 <PostMethod  xmlns="http://tempuri.org/"><varString>1</varString><varBool>true</varBool> </PostMethod>

UriTemplateを使用すると、URIを介して値を渡すため、POSTになりますが、本文は空になります。

使用できるcurlに最も近いオプションはJSONです

[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json)]
string PostMethodJson(string varString, bool varBool);

それはきれいではありませんが、あなたはこれを使うことができます:

curl -d"{\"varString\":\"so99\",\"varBool\":\"true\"}"  -i -X POST -H "Content-Type:application/json"  http://localhost:3000/MyService/PostMethodJson
于 2012-04-18T15:09:22.913 に答える