2013-09-01 189 views
1

我已經創建了我的第一個WCF Web服務,並且我試圖根據一些傳遞的參數從它返回一個圖像。我收到錯誤:從WCF Web服務返回圖像

The content type image/jpeg of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly.

我該如何解決此問題?

我的網站正在調用該服務的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> 

的Web服務的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,所以任何幫助/指針將不勝感激!

更新 實施蒂姆的建議後,我得到一個新的錯誤:

There was no endpoint listening at localhost:59473/RestImageService.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.

我不知道如何配置網絡服務來解決這個問題。有什麼建議麼?

這是我如何訪問Web服務:

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

我希望能夠以我的形象的src標籤設置爲網絡服務的網址,一旦我得到它的工作。

+0

您使用的是SOAP還是REST? – Tim

+0

您的綁定協議不匹配。 –

+0

@GrantThomas我搜索了一下,但我不知道如何使綁定協議匹配。你能給我指針嗎? – drizzie

回答

1

basicHttpBinding是SOAP(版本1.1)。爲了啓用基於REST的服務,我相信(自己並沒有做太多工作),您需要使用webHttpBinding

我會嘗試這樣的事情。在服務的配置文件,進行以下更改:

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

應該配置默認綁定是webHttpBindinghttp電話。

<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側),所以我認爲這至少會讓你指出正確的方向。

EDIT

RestImageServiceClient是SOAP客戶端。要使用REST服務,您需要使用HTTP API。下面是從[WCF REST服務以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調用。

+0

這樣做的結果是一個新錯誤:在http:// localhost:59473/RestImageService.svc上沒有端點可以接受該消息。這通常是由不正確的地址或SOAP操作引起的。有關更多詳細信息,請參閱InnerException(如果存在)。 – drizzie

+0

你打算如何在代碼中調用服務?你可以用你正在使用的代碼編輯你的問題嗎?這聽起來像你試圖使用代理(客戶端),這是一種SOAP方法,而不是REST。 – Tim

+0

用代碼編輯。 – drizzie