C# HTTP POST到WCF服务

C# HTTP POST到WCF服务,c#,wcf,C#,Wcf,我试图通过HTTPPOST调用WCF服务,但该服务返回400错误。我不知道这是因为运营合同还是我的工作方式。这是合同在服务器端的外观: [OperationContract, WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] Stream Download(string username, int fileid); 下面是我如何通过测试控制台应用程序调用该服务: HttpWebRequest webRequest = WebRequest.

我试图通过HTTPPOST调用WCF服务,但该服务返回400错误。我不知道这是因为运营合同还是我的工作方式。这是合同在服务器端的外观:

[OperationContract, WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]
Stream Download(string username, int fileid);
下面是我如何通过测试控制台应用程序调用该服务:

HttpWebRequest webRequest = WebRequest.Create("http://localhost:8000/File/Download") as   
HttpWebRequest;
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
byte[] bytes = Encoding.ASCII.GetBytes("username=test&fileid=1");
Stream os = null;
webRequest.ContentLength = bytes.Length;
os = webRequest.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
WebResponse webResponse = webRequest.GetResponse();

编辑:我应该明确我的目标是测试服务,而不是让它接受原始HTTP帖子。如果有更好的方法可以测试该服务,请随意分享。

这是一个非常简单的过程,但不容易访问或直接访问(不幸的是,WCF的许多方面都是如此),请查看帖子以获得澄清:

服务合同:

[ServiceContract]
public interface ISampleService
{
    [OperationContract]
    [WebInvoke(UriTemplate = "invoke")]
    void DoWork(Stream input);
}
HTML来源:

<form method="post" action="Service.svc/invoke">
    <label for="firstName">First Name</label>: <input type="text" name="firstName" value="" />
    <br /><br />
    <label for="lastName">Last Name</label>: <input type="text" name="lastName" value="" />
    <p><input type="submit" /></p>
</form>

如果您能够使用其他内容类型,则可以使用json,这在您的示例中是可行的

改变

webRequest.ContentType = "application/x-www-form-urlencoded";
byte[] bytes = Encoding.ASCII.GetBytes("username=test&fileid=1");


如果你必须使用application/x-www-form-urlencoded content type,那么在谷歌上搜索几个帖子和其他描述解决方法的问题。

让服务接受原始帖子不是我的目标。我只是试图通过从测试客户机调用该方法来测试服务,我错误地认为原始帖子是最简单的方法。鉴于我的原始帖子中的OperationContract,我应该如何调用它?不幸的是,WCF不支持开箱即用的表单url编码。这就是为什么我给你指出了“原始”解决方案。您可以改为使用“GET”并在UriTemplate中格式化您的参数如果使用单个流输入是发布到WCF服务的唯一方式,那么为什么WebInvoke/POST OperationContracts中存在具有多个输入参数的代码示例?查看此链接以获取示例:流不是发布到wcf的唯一方式。大多数使用WebInvoke(post)的人都使用xml或JSON文档来提供参数。链接到的文档采用已发布的xml(或json)文档。我知道,这不是直截了当的。StackOverflow充满了这样的问题@rafale I使用了公共字符串Ping(流输入),WCF测试客户机表示不支持该操作,因为它使用System.IO.Stream类型。您知道为什么不支持流,以及从curl读取帖子的其他方法是什么吗?因此,我的服务将从curl-d message=alohaI使用的
application/x-www-form-urlencoded
获取数据,因为我认为我应该在所有帖子中使用这些数据。我不知道
application/json
,它给了我想要的东西。非常感谢。
webRequest.ContentType = "application/x-www-form-urlencoded";
byte[] bytes = Encoding.ASCII.GetBytes("username=test&fileid=1");
webRequest.ContentType = "application/json";
byte[] bytes = Encoding.ASCII.GetBytes("{\"username\":\"test\",\"fileid\":1");