尝试使用WebRequest调用WCF服务

时间:2010-03-04 20:42:22

标签: c# wcf rest post webrequest

我有一个WCF服务,需要由第三方应用程序调用,发布一些原始XML。

我试图通过构建一个简单的WebRequest并向服务发出请求来测试我的服务。

这是我的服务代码:

接口:

    [ServiceContract(Namespace = "http://test.mydomain.com")]
public interface ITest
{
    [WebInvoke(UriTemplate = "", BodyStyle = WebMessageBodyStyle.Bare, Method="POST")]
    [OperationContract]
    Stream SaveXML(Stream input);
}

服务:

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(Namespace = "http://test.mydomain.com")]
public class Test : ITest
{
    public Stream SaveXML(Stream input)
    {
        StreamReader streamReader = new StreamReader(input);
        string rawString = streamReader.ReadToEnd();
        streamReader.Dispose();

        // here need to save the input stream to xml format file
        Encoding encoding = Encoding.GetEncoding("ISO-8859-1");
        WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
        byte[] returnBytes = encoding.GetBytes(rawString);
        return new MemoryStream(returnBytes);
    }
}

配置:

    <services>
  <service behaviorConfiguration="Blah.TestBehavior" name="Blah.Test">
    <endpoint address="http://localhost:51494/Blah/Test.svc" binding="basicHttpBinding" contract="Blah.ITest">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

错误的客户端代码:

            string postData = "<Message version=\"1.5\" xmlns=\"http://test.mydomain.com\" ><books>Blah</books></Message>";
        WebRequest request = WebRequest.Create("http://localhost:51494/Blah/Test.svc/SaveXML");
        request.Method = "POST";

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        request.ContentType = "application/x-www-form-urlencoded";
        //request.ContentType = "text/xml; charset=utf-8";
        //request.ContentType = "text/xml;";
        //request.ContentType = "application/xml;";
        request.ContentLength = byteArray.Length;

        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        // Get the response.
        WebResponse response = request.GetResponse();

在最后一行,我收到400(错误请求)或415(不支持的媒体类型)错误,具体取决于我指定的ContentType。

此外,如果我在我的客户端应用程序中添加服务引用,并使用API​​调用该服务,它可以正常工作。任何见解都会非常感激,因为我是WCF的新手,并且完全难以接受。

2 个答案:

答案 0 :(得分:7)

我认为你在这里混合了两件不同的东西:

  1. WebRequestPOST以及[WebInvoke]属性表示您正在尝试执行类似REST的操作
  2. 但是,您的服务配置有basicHttpBinding - 一个不会随WebRequest一起飞行的SOAP协议
  3. 所以 - 下定决心!

    您想使用SOAP吗?然后你可以按原样使用basicHttpBinding,但是你不能像使用POST的WebRequest那样访问SOAP服务 - 你需要在命令行上使用Visual Studio生成的SOAP客户端或svcutil.exe。 / p>

    您想使用WebRequest和简单的POST请求吗?然后,您需要创建基于REST的WCF服务 - 使用webHttpBindingWebServiceHost(而不是普通的ServiceHost)。

    对于基于SOAP的WCF服务,请查看WCF Developer Center on MSDN

    对于基于REST的WCF服务(可以在浏览器中导航,可以从WebRequest调用),请查看WCF REST Developer Center on MSDN并查看REST上的优秀screencast series by Pluralsight基于WCF的开发 - 最值得注意的是:

答案 1 :(得分:1)

basicHttpBinding也适用!

我花了将近一天的时间通过basicHttpBinding来了解WebRequest对WCF服务的错误,结果发现我错过了一些小而重要的事情: SOAPAction 标头必须设置!

newRequest.Headers["SOAPAction"] = "http://tempuri.org/INotificationService/MyMethodName"