2011-02-06 207 views
1

我想将一个序列化的对象POST到我的WCF服务。但是,我一直收到“NotFound”错误。我一直在这里打了三天。有人能告诉我我做错了什么吗?下面是我的客户端代码,我的WCF服务操作以及我试图序列化的类定义。POST到WCF服务

客户端代码

// Build a wrapper exception that will be serialized 
Exception ex = e.ExceptionObject; 
MyException exception = new MyException(ex.Message, ex.StackTrace, "silverlight app", ex.GetType().FullName, string.Empty); 

string json = string.Empty; 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    // Serialize the object 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(objectType); 
    serializer.WriteObject(memoryStream, objectToSerialize); 

    // Convert the data to json 
    byte[] bytes = memoryStream.ToArray(); 
    int count = (int)(memoryStream.Length); 
    json = Encoding.UTF8.GetString(bytes, 0, count); 
} 

// Submit the information to log 
string url = "http://localhost:90/services/MyService.svc/LogError"; 
WebClient loggingService = new WebClient(); 
loggingService.UploadStringCompleted += new UploadStringCompletedEventHandler(loggingService_UploadStringCompleted); 
loggingService.Headers["Content-type"] = "application/json"; 
loggingService.Encoding = Encoding.UTF8; 
loggingService.UploadStringAsync(new Uri(logExceptionUrl), "POST", json); 

MyException(客户端版)

public class MyException : Exception 
{ 
    private readonly string stackTrace; 
    public override string StackTrace 
    { 
    get { 
     return base.StackTrace; 
    } 
    } 

    private readonly string message; 
    public override string Message 
    { 
    get { 
     return base.Message; 
    } 
    } 

    private readonly string component; 
    public string Component 
    { 
    get { return component; } 
    } 

    private readonly string typeName; 
    public string TypeName 
    { 
    get { return typeName; } 
    } 

    private readonly string miscellaneous; 
    public string Miscellaneous 
    { 
    get { return miscellaneous; } 
    } 

    public MyException() 
    { } 

    public MyException(string message) : base(message) 
    { } 

    public MyException(string message, Exception inner) : base(message, inner) 
    { } 

    public MyException(string message, string stackTrace) : base() 
    { 
    this.message = message; 
    this.stackTrace = stackTrace; 
    } 

    public MyException(string message, string stackTrace, string component, string typeName, string miscellaneous) : base() 
    { 
    this.message = message; 
    this.stackTrace = stackTrace; 
    this.component = component; 
    this.typeName = typeName; 
    this.miscellaneous = miscellaneous; 
    } 
} 

WCF服务

[OperationContract] 
[WebInvoke(UriTemplate = "/LogError", BodyStyle=WebMessageBodyStyle.Bare, RequestFormat=WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
public string LogError(MyException exc) 
{ 
    try 
    { 
    // Write the details of exc to the database 
    return "ok"; 
    } 
    catch (Exception ex) 
    { 
    return "error"; 
    } 
} 

MyException在WCF项目

[Serializable] 
public class MyException : Exception 
{ 
    public override string StackTrace 
    { 
    get { return base.StackTrace; } 
    } 
    private readonly string stackTrace; 

    public override string Message 
    { 
    get { return base.Message; } 
    } 
    private readonly string message; 

    public string Component 
    { 
    get { return component; } 
    set { /* */ } 
    } 
    private readonly string component; 

    public string TypeName 
    { 
    get { return typeName; } 
    set { /* */ } 
    } 
    private readonly string typeName; 

    public string Miscellaneous 
    { 
    get { return miscellaneous; } 
    set { /* */ } 
    } 
    private readonly string miscellaneous; 

    public MyException() 
    {} 

    public MyException(string message) : base(message) 
    { } 

    public MyException(string message, Exception inner) : base(message, inner) 
    { } 

    public MyException(string message, string stackTrace) : base() 
    { 
    this.message = message; 
    this.stackTrace = stackTrace; 
    } 

    public MyException(string message, string stackTrace, string component, string typeName, string miscellaneous) : base() 
    { 
    this.message = message; 
    this.stackTrace = stackTrace; 
    this.component = component; 
    this.typeName = typeName; 
    this.miscellaneous = miscellaneous; 
    } 

    protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) 
    { 
    component = info.GetString("component"); 
    typeName = info.GetString("typeName"); 
    miscellaneous = info.GetString("miscellaneous"); 
    } 

    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
    base.GetObjectData(info, context); 
    info.AddValue("component", component); 
    info.AddValue("typeName", typeName); 
    info.AddValue("miscellaneous", miscellaneous); 
    } 
} 

谢谢您的帮助!

+0

当你说“找不到”时,你能否详细说明确切的HTTP错误。它是404还是400(坏请求)? – 2011-02-06 14:16:07

回答

2

为了在.NET中调用Web服务,您通常会生成一个客户端代理。您可以在Visual Studio中使用svcutil.exe实用程序或Add Service Reference...对话框。一旦你的强类型的客户端代理,你只需调用服务,而无需使用任何Web客户,MemoryStreams,DataContractJsonSerializers,...

using (var client = new MyWebServiceClient()) 
{ 
    var result = client.SomeMethod(); 
} 

WCF基础结构负责剩下的照顾。

+0

嗨达林,我明白这个方法。不过,我也想稍后从Android应用程序中调用此方法。正因为如此,我试图了解如何在客户端正确序列化一个对象。 – user208662 2011-02-06 14:16:53