【问题标题】:Return image from WCF web service从 WCF Web 服务返回图像
【发布时间】:2013-09-01 01:29:58
【问题描述】:

我已经创建了我的第一个 WCF Web 服务,我正试图根据一些传递的参数从中返回一个图像。我收到错误消息:

响应消息的内容类型 image/jpeg 与绑定的内容类型(text/xml;charset=utf-8)不匹配。如果使用自定义编码器,请确保正确实现 IsContentTypeSupported 方法。

我需要做什么来解决这个问题?

调用该服务的网站的 web.config 文件具有以下配置:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IRestImageService" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:59473/RestImageService.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRestImageService"
    contract="RestImageService.IRestImageService" name="BasicHttpBinding_IRestImageService" />
</client>

webservice web.config 如下所示:

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<protocolMapping>
  <add binding="basicHttpsBinding" scheme="https"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true"/>

服务合同:

[OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "Image/{type}/{typeid}/{imageid}/{size}/{extension}",
        RequestFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped)]
    Stream Image(string type, string typeid, string imageid, string size = "lrg", string extension = "jpg");

我是 WCF 的新手,非常感谢任何帮助/指点!

更新 执行蒂姆的建议后,我收到一个新错误:

在 localhost:59473/RestImageService.svc 上没有可以接受消息的端点侦听。这通常是由不正确的地址或 SOAP 操作引起的。有关详细信息,请参阅 InnerException(如果存在)。

我不确定如何配置 Web 服务来解决此问题。有什么建议吗?

这是我访问网络服务的方式:

RestImageServiceClient client = new RestImageServiceClient();
    client.Image(WSC.Common.BO.User.User.ImageFolder.Buyer, "27085", "BuyerPhoto", "LRG", "jpg");

我希望能够在我的图片的 src 标签设置为 web 服务 url 一旦我得到它的工作。

【问题讨论】:

  • 您使用的是 SOAP 还是 REST?
  • 您的绑定协议不匹配。
  • @GrantThomas 我已经用谷歌搜索了,但我不确定如何使绑定协议匹配。可以指点一下吗?
  • @Tim 我正在尝试制作一个 RESTful 网络服务。
  • 我将协议映射更改为 。结果相同

标签: c# asp.net wcf web-services


【解决方案1】:

basicHttpBinding 是 SOAP(版本 1.1)。要启用基于 REST 的服务,我相信(我自己并没有做太多)您需要使用 webHttpBinding

我会尝试这样的事情。在您的服务的配置文件中,进行以下更改:

<protocolMapping>
  <add binding="webHttpBinding" scheme="http"/>
</protocolMapping>

应该将您的默认绑定配置为webHttpBinding,用于http 调用。

<behaviors>
  <endpointBehaviors>
    <behavior>
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

上述代码应该webHttp添加一个默认端点行为。

最后,在您的客户端配置文件中,进行以下更改:

<client>
  <endpoint address="http://localhost:59473/RestImageService.svc"
            binding="webHttpBinding"
            contract="RestImageService.IRestImageService" 
            name="WebHttpBinding_IRestImageService" />
</client>

我不能肯定这会奏效,但我在 WCF 方面做了很多工作(在 SOAP 方面),所以我认为这至少可以让你找到正确的方向。

编辑

RestImageServiceClient 是一个 SOAP 客户端。要使用 REST 服务,您需要使用 HTTP API。这是 [WCF REST Service with JSON]http://www.codeproject.com/Articles/327420/WCF-REST-Service-with-JSON) 中的一个示例:

WebClient client = new WebClient();
byte[] data = client.DownloadData("http://localhost:11523/Service1.svc/GetData");
Stream stream = new MemoryStream(data);

DataContractJsonSerializer obj = new DataContractJsonSerializer(typeof(string));
string result = obj.ReadObject(stream).ToString();

我建议在谷歌上搜索“WCF REST JSON 客户端示例”——您会得到很多点击率和几种不同的方法。

作为补充说明,您可以使用您的 SOAP 客户端进行 SOAP 调用,只要您在服务上公开了一个 SOAP 端点。

【讨论】:

  • 这个结果是一个新的错误:在localhost:59473/RestImageService.svc 没有可以接受消息的端点监听。这通常是由不正确的地址或 SOAP 操作引起的。有关更多详细信息,请参阅 InnerException(如果存在)。
  • 您如何尝试在代码中调用该服务?你能用你正在使用的代码编辑你的问题吗?听起来您正在尝试使用代理(客户端),这是一种 SOAP 方法,而不是 REST。
  • 查看我对答案的编辑 - 这里的关键是 REST 和 SOAP 的客户端是不同的。 SOAP 使用代理,而 REST 将使用某种 HTTP API。
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2019-06-08
相关资源
最近更新 更多