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

本文关键字:WCF 服务 POST 参数 何使用 curl | 更新日期: 2023-09-27 18:31:30

如何使用

命令行工具curl发布到具有 1 个以上参数的 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

错误在哪里?方法的体型有误吗?我是否应该像下面这样将参数包装在 [DataContract] 类中?

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

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

修改后的答案:

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