2012-04-17 52 views
3

如何使用命令行工具curl发布到具有多个参数的WCF服务?如何使用卷曲到WCF服务的参数进行POST

我有一个像下面

[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 -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

修订的答案:

URI模板将不使用卷曲POST请求的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传递的值,因此这是一个职位,但空体。

,卷曲最接近的选项,你可以使用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 
+0

这不回应'卷曲-s -d varString = foo -d varBool = true http:// localhost:3000/MyService/PostMethod'。虽然它确实有效,但如果我这样做,而不是'curl -s -d doesnot =重要http:// localhost:3000/MyService/PostMethod?varString = foo&varBool = true'。如果不需要提供数据参数或将其用于数据而不是url,那就太好了。 – Jason 2012-04-18 18:48:02

+0

嗯,我试过这个,它在这里工作(我从PowerShell运行卷曲)。让我看看为什么有差异。 – 2012-04-18 20:42:31

+0

我正在使用没有默认端点的.net 4.0。虽然我认为这不会导致它为你工作而不是为我工作。你对内容类型做了些什么? – Jason 2012-04-18 21:36:42