如何使用curl将参数POST到WCF服务

时间:2012-04-17 20:27:31

标签: c# wcf http curl

如何使用命令行工具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; }
}

1 个答案:

答案 0 :(得分:1)

修改回答:

URI模板不适用于使用curl将请求发布到Web服务。 WebInvoke期望POST主体是XML或JSON。

WebMessageBodyStyle.Bare不起作用,因为你有2个参数,所以你必须换行。

[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