Question

I have a Service and the releated interface under namespace called "WCFService":

[ServiceContract]
public interface IBook
{
    [OperationContract]
    [WebInvoke(Method="GET"
        ,ResponseFormat=WebMessageFormat.Json
        ,BodyStyle=WebMessageBodyStyle.Wrapped
        ,UriTemplate="/?bookID={bookID}")]
    Book Get(int bookID);
}

//========================================================

 public Book Get(int bookID)
 {
     return bookList.Where(p => p.BookID == bookID).FirstOrDefault();  
 }

And the Book DataModel is under another namespace called "WCFModel":

[DataContract]
public class Book
{
    [DataMember]
    public int BookID { get; set; }

    [DataMember]
    public string BookName { get; set; }

    [DataMember]
    public decimal BookPrice { get; set; }

    [DataMember]
    public string BookPublish { get; set; }
}

After set the config file, I got the service run ok. Then I planned to consume it in client side. I added a windows form application to the project and added reference to the WCFModel book datamodel, I used below code to extract the data:

    string serviceURL = "http://localhost:15020/BookService.svc/?bookID=" + txtBookID.Text.Trim();
    var request = WebRequest.Create(serviceURL);
    var response = request.GetResponse();
    DataContractSerializer serializer = new DataContractSerializer(typeof(WCFModel.Book));
    var bookObj = serializer.ReadObject(response.GetResponseStream());

But the result was, VS thrown me an exception at the ReadObject below:

Error when deserializing the WCFModel.Book  type, Data at the root level is invalid.

stack trace below:

在 System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)
在 System.Xml.XmlUTF8TextReader.Read()
在 System.Xml.XmlBaseReader.IsStartElement()
在 System.Xml.XmlBaseReader.IsStartElement(XmlDictionaryString localName, XmlDictionaryString namespaceUri)
在 System.Runtime.Serialization.XmlReaderDelegator.IsStartElement(XmlDictionaryString localname, XmlDictionaryString ns)
在 System.Runtime.Serialization.XmlObjectSerializer.IsRootElement(XmlReaderDelegator reader, DataContract contract, XmlDictionaryString name, XmlDictionaryString ns)
在 System.Runtime.Serialization.DataContractSerializer.InternalIsStartObject(XmlReaderDelegator reader)
在 System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)

I don't know why, After searching a lot, I still can't get the point. Anyone can give me some reference? thx.

Était-ce utile?

La solution

I hope this may work for you! Try implementing this!

WebClient proxy = new WebClient();
string serviceURL = 
       string.Format("http://localhost:15020/BookService.svc/?bookID=" + txtBookID.Text.Trim().ToString()); 
 byte[] data = proxy.DownloadData(serviceURL);
 Stream stream = new MemoryStream(data);
 DataContractJsonSerializer obj = 
                    new DataContractJsonSerializer(typeof(Book));
 Book book = obj.ReadObject(stream) as Book;
 Console.WriteLine("Book ID : " + book.BookID);
 Console.WriteLine("Book Name : " + book.BookName);
 Console.WriteLine("Book ID : " + book.BookPrice);
 Console.WriteLine("Book ID : " + book.BookPublish);

See this link

EDIT: Change BodyStyle=WebMessageBodyStyle.Wrapped to BodyStyle=WebMessageBodyStyle.Bare.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top