De retour de type non valide erreur lors de l'appel de la WCF service web 4.0
Je suis en train d'écrire et appel de service web WCF, voici les détails:
Web.config:
<add relativeAddress="FetchData.svc" service="WCF.Services.FetchData" />
<service name="WCF.Services.FetchData">
<endpoint address="" binding="webHttpBinding" bindingConfiguration="" name="FetchData" contract="WCF.Services.FetchData" />
</service>
FetchData Classe (Exemple De Code):
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Web;
using System.Xml;
using Webservices.Services;
using Data = Webservices.Data;
using System.ServiceModel.Web;
using System.IO;
using System.Net;
using System.ServiceModel.Channels;
using System.Web.UI;
using System.Text;
namespace WCF.Services
{
[ServiceContract(Namespace = "urn:WCF.Services.FetchData")]
public class FetchData
{
Data.GetConnect mConnect = new Data.GetConnect();
private Message RetrievePublishedData(String pub, int number)
{
String strOutput = String.Empty;
if (!String.IsNullOrEmpty(pub))
{
Boolean pubURLExists = mConnect.CheckPubUrlExists(pub);
if (!pubURLExists)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
return WebOperationContext.Current.CreateTextResponse(String.Format("Requested publication '{0}' is not available.", pub), MimeTypes.TextPlain, Encoding.UTF8);
}
using (StringWriter sw = new StringWriterEncoding())
{
using (HtmlTextWriter hw = new HtmlTextWriter(sw))
{
hw.RenderBeginTag(HtmlTextWriterTag.Html);
XmlNode publishedData = mConnect.GetPublishedData(pub, number);
hw.RenderEndTag();
}
return WebOperationContext.Current.CreateTextResponse(sw.ToString(),MimeTypes.TextHTML, Encoding.UTF8);
}
}
return WebOperationContext.Current.CreateTextResponse(strOutput, MimeTypes.TextHTML, Encoding.UTF8);
}
[OperationContract]
[WebGet(UriTemplate = "/published/{number}/{*pub=default}")]
public Message FetchPublished(String pub, int number)
{
return RetrievePublishedData(pub, number);
}
}
}
Maintenant, quand je suis en train de naviguer sur le web service, je suis d'erreur ci-dessous:
URL du Service Web - http://localhost:8082/FetchData.svc
Erreur:
L'opération "FetchPublished' n'a pas pu être chargé, car il a un paramètre ou le type de retour de type System.ServiceModel.Les canaux.Message ou un type qui a MessageContractAttribute et d'autres paramètres de types différents. Lors de l'utilisation du Système.ServiceModel.Les canaux.Message ou de types avec MessageContractAttribute, la méthode ne doit pas utiliser d'autres types de paramètres.
Edit:
namespace WCFWebServices
{
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
[ServiceContract(Namespace = "urn:WCFWebServices.fetchPush")]
public class FetchData
{
[MessageContract]
public class RetrievePublishedDataInput
{
[MessageBodyMember]
public String pub;
[MessageBodyMember]
public String number;
}
private Message RetrievePublishedData(RetrievePublishedDataInput input)
{
String strOutput = String.Empty;
String pub = input.pub;
String number = input.number;
if (!String.IsNullOrEmpty(pub))
{
Boolean pubURLExists = true;
if (!pubURLExists)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
return WebOperationContext.Current.CreateTextResponse(String.Format("Requested publication '{0}' is not available.", pub), "application/plain; charset=utf-8", Encoding.UTF8);
}
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter hw = new HtmlTextWriter(sw))
{
hw.RenderBeginTag(HtmlTextWriterTag.Html);
hw.RenderEndTag();
}
return WebOperationContext.Current.CreateTextResponse(sw.ToString(), "application/html; charset=utf-8", Encoding.UTF8);
}
}
return WebOperationContext.Current.CreateTextResponse(strOutput, "application/html; charset=utf-8", Encoding.UTF8);
}
[OperationContract]
[WebGet(UriTemplate = "/publishedData/{number}/{pub=default}")]
public Message FetchPublished(RetrievePublishedDataInput input)
{
return RetrievePublishedData(input);
}
}
}
OriginalL'auteur Manoj Singh | 2013-12-24
Vous devez vous connecter pour publier un commentaire.
Je crois que mentionné erreur est assez explicite. Selon la MSDN, à l'aide de
Message
classe a ses propres restrictions:Dans le cas de votre contrat, la seconde restriction est violé. La plus simple solution de contournement consiste à créer la bonne
MessageContract
:J'ai mis à jour ma réponse à montrer quels sont les changements que vous devez faire.
Konrad, il a travaillé, mais je suis maintenant "ne peuvent pas être traitées au niveau du récepteur, en raison d'une AddressFilter inadéquation à la EndpointDispatcher. Vérifiez que l'émetteur et le récepteur du EndpointAddresses d'accord" lorsque j'essaie d'appeler cette url "localhost:52891/FetchData.svc/publié/0"
J'ai commencé à décrire la façon de consommer
MessageContract
avecwebHttpBinding
mais je mais je de vous demander pourquoi vous voulez revenirMessage
? Je suppose que vous le faire intentionnellement, mais peut-être que c'est juste une erreur? Si vous revenez de classe normale, vous n'aurez pas besoin d'utiliserMessageContract
et normal, RESTE adresses seront applicables.Konrad, merci aussi pour notre architecture, nous avons mis en œuvre même façon, est-t-il d'autres façons de mettre en œuvre tout cela, l'idée à ce sujet Le message avec l'Action " ne peuvent pas être traitées au niveau du récepteur, en raison d'un ContractFilter inadéquation à la EndpointDispatcher. Cela peut être en raison d'un contrat d'incompatibilité (décalage des Actions entre l'émetteur et le récepteur) ou une liaison/de la sécurité de l'inadéquation entre l'émetteur et le récepteur. Vérifiez que l'émetteur et le récepteur ont le même contrat et la même liaison (y compris les exigences en matière de sécurité, par exemple, de Message, de Transport, Aucun)...semble manquant un peu de configuration
OriginalL'auteur Konrad Kokosa