WCF Restful返回HttpResponseMessage想要协商设置内容

本文关键字:协商 设置 Restful 返回 HttpResponseMessage WCF | 更新日期: 2023-09-27 18:13:04

我有一个WCF Restful服务,我希望方法返回HttpResponseMessage,因为它似乎是结构化的,而不仅仅是返回数据或异常或其他任何可能使其方式。

我假设这是正确的,如果不让我知道,但我的问题是当我尝试设置HttpResponseMessage.Content时会发生什么。当我这样做时,我在其中进行RESTful调用的客户机请求身份验证。

下面是我的代码:

在界面中:

[WebGet(UriTemplate = "/GetDetailsForName?name={name}"
                    , ResponseFormat = WebMessageFormat.Json)]
HttpResponseMessage GetDetailsForName(string name);

在课堂上:

public HttpResponseMessage GetDetailsForName(string name)
{
   HttpResponseMessage hrm = new HttpResponseMessage(HttpStatusCode.OK)
       {
       //If I leave this line out, I get the response, albeit empty  
       Content = new StringContent("Hi") 
       };
   return hrm;
}

我想尝试使用Request.CreateResponse,但我似乎无法从我的WCF Restful方法得到请求。OperationContext.Current.RequestContext没有CreateResponse.

指针吗?

WCF Restful返回HttpResponseMessage想要协商设置内容

不幸的是这不起作用。演示代码如下:

构造一个HttpResponseMessage对象,用JSON序列化器序列化它,并通过网络传递结果。

问题是HttpResponseMessage是一次性的,不打算序列化,而StringContent根本不能序列化。

关于为什么您被重定向到身份验证表单-当服务不能序列化StringContent时抛出异常并返回一个400 HTTP状态码,该状态码被解释为身份验证问题。

我有一个类似的错误,但不完全相同。我试图序列化一个普通对象,并得到一个net::ERR_Conection_Reset消息。wcf方法执行了7次,从未抛出异常。

我发现我必须注释我要返回的类,这样我的JSON序列化器才能理解如何序列化这个类。下面是我的wcf方法:

[OperationContract]
[WebGet(
    UriTemplate = "timeexpensemap", 
    ResponseFormat = WebMessageFormat.Json)]
    public TimeexpenseMap timeexpensemap() {
        string sql = "select * from blah"
        DbDataReader reader = this.GetReader(sql);
        TimeexpenseMap tem = null;
        if (reader.Read()) {
            tem = new TimeexpenseMap();
            // Set properties on tem object here
        }
        return tem;
    }

序列化失败的原始类没有注释:

public class TimeexpenseMap {
    public long? clientid { get; set; }
    public int? expenses { get; set; }
}

没有问题序列化的带注释的类:

[DataContract]
public class TimeexpenseMap {
    [DataMember]
    public long? clientid { get; set; }
    [DataMember]
    public int? expenses { get; set; }
}

如果我调用,例如公共字符串getDetails(int ID)并抛出错误,这是有效的…

catch(Exception ex)
 {
 OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
 response.StatusCode = System.Net.HttpStatusCode.OK; //this returns whatever Status Code you want to set here
 response.StatusDescription = ex.Message.ToString(); //this can be accessed in the client
 return "returnValue:-998,message:'"Database error retrieving customer details'""; //this is returned in the body and can be read from the stream
 }