2012-04-17 31 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