【问题标题】:Trying to call a WCF service with a WebRequest尝试使用 WebRequest 调用 WCF 服务
【发布时间】:2010-03-04 20:42:21
【问题描述】:

我有一个需要由第 3 方应用调用的 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 的新手并且完全被难住了。

【问题讨论】:

  • 我会做什么:使用 Fiddler fiddler2.com/fiddler2 来查看对“API”的请求——那个有效的。然后将其与不起作用的请求进行比较。那应该缩小范围。
  • 您的StreamReader 需要在using 块中,您的其他几个对象也是如此。即使抛出异常,using 块也会导致它们被处理掉。

标签: c# wcf rest post webrequest


【解决方案1】:

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

  1. WebRequestPOST[WebInvoke] 属性表明您正在尝试执行类似 REST 的操作
  2. 但是,您的服务配置有 basicHttpBinding - 一个 SOAP 协议,它不会与 WebRequest 一起使用

所以 - 下定决心!

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

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

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

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

【讨论】:

  • WCF 开发者中心似乎死了 - 有可用的更新链接吗?
  • .. 不幸的是,还有 RESTful 视频。
  • @Default: 抱歉,那些链接没问题——在 2010 当我回答时——但你是对的,他们似乎已经死了。很抱歉,我没有任何备用链接.....尝试询问 Google 或 Bing,也许??
  • 我知道你在2010年写了答案,无需指出。当 stackoverflow 上的链接失效时,我通常会让 OP 知道,因为我不只是想随机更新指向其他资源的链接。我的目的是让其他访问者也以某种方式更新链接,而不仅仅是现在,对我来说。如果你冒犯了我很抱歉。我会试试谷歌。
【解决方案2】:

basicHttpBinding也适合!

我花了将近一天的时间来弄清楚 WebRequest 到 WCF 服务与 basicHttpBinding 的问题,结果发现我错过了一个小而重要的事情:必须设置 SOAPAction 标头!

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

【讨论】:

  • 你在WebRequest 的正文中提供了什么。它是否也包括 SOAPHeaders。
  • @autrevo,你的意思是请求流?您可以安装 http 代理(例如 Fiddler)并检查 WCF 服务调用中发送的内容。您将看到请求正文和标头。我必须在我的任务中转发请求,所以我没有自己构建请求正文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2012-04-24
相关资源
最近更新 更多