I have a WCF web service that used to work fine. Somewhere down the line it stopped and I cant tell why. The code and the interface never changed nor did the web.config (at least not in relation to the web services section). I have a class:
[DataContract]
public class QuizServiceArgs
{
[DataMember(IsRequired = true, Order = 1)]
public int Category1 { get; set; }
[DataMember(IsRequired = true, Order = 2)]
public int Category2 { get; set; }
[DataMember(IsRequired = true, Order = 3)]
public int Category3 { get; set; }
[DataMember(IsRequired = true, Order = 4)]
public int Category4 { get; set; }
}
And the service interface is simple:
public interface IQuizService
{
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json)]
ServiceResult Save(QuizServiceArgs answers, string strvalue, int intvalue);
}
The second two params strvalue
and intvalue
were added only for troubleshooting to see if those were getting deserialized -- and they are. When I hit the service, I get an error saying that I'm missing the Category1
parameter from the request but as you can see this Fiddler screenshot, the values are there.
I can get primitive values to pass in but objects seem to all be instantiated with null or default values. What am I doing wrong?
I never actually got my original question answered which sucks, but Sixto suggested that I switch my serialization to JSON. JSON was the original design but got nixed when I was having trouble with it. After I successfully switched back to JSON, everything was serializing and deserializing properly. Now I am just waiting for this to break for no explanation so I can switch back to XML....
This code constructs an instance of the DataContractSerializer that can be used only to serialize or deserialize instances of the Person class. DataContractSerializer dcs = new DataContractSerializer(typeof(Person)); // This can now be used to serialize/deserialize Person but not PurchaseOrder.
The process forms a sequence of bytes into a logical object; this is called an encoding process. At runtime when WCF receives the logical message, it transforms them back into corresponding . Net objects. This process is called serialization.
By default WCF uses the DataContractSerializer class to serialize data types.
You have a namespace issue. By default, when you create an interface for the servicecontract, it assigns it a namespace. Namespace is like scope for the SOAP xml elements, and if it doesn't fall under the same scope, it thinks it doesn't exist. Chances are the code that posts stoppped providing the namespace(?). You have to refer by it when posting the XML - but I'm not entirely sure what it assigns(something server specific), so it is good practice to always define a namespace, like so:
[ServiceContract(Namespace = "your namespace")]
public interface IQuizService
{
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json)]
ServiceResult Save(QuizServiceArgs answers, string strvalue,
int intvalue);
}
And then the posts should have the namespace in the SOAP request.
<Save xmlns="your namespace">.....</Save>
The namespace should also match your service declaration in web.config.
Also need it in the datacontract
[DataContract(Namespace = "your namespace")]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With