Skip to main content
 首页 » 编程设计

c#之尝试使用 WebRequest 调用 WCF 服务

2024年01月22日31shanyou

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

请您参考如下方法:

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

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

  • 所以——下定决心!

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

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

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

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