我有一個帶有方法的 WCF 服務應用程式
public PersonResponse(PersonRequest request)
{
return new PersonResponse { Id = 1, Name = "Mark" };
}
對于該方法,我可能有 2 種不同的回應
[DataContract]
public class PersonResponse
{
int id;
string name;
[DataMember]
public int Id
{
get { return id; }
set { id = value; }
}
[DataMember]
public string Name
{
get { return name; }
set { name = value; }
}
}
和
[DataContract]
public class ErrorResponse
{
int errorCode;
string errorText;
[DataMember]
public int? ErrorCode
{
get { return errorCode; }
set { errorCode = value; }
}
[DataMember]
public string ErrorText
{
get { return errorText; }
set { errorText = value; }
}
}
是否可以撰寫一個可以回傳其中任何一個回應但不能同時回傳兩者的方法?
我可以做類似的事情
[DataContract]
public class Response
{
PersonResponse personResponse;
ErrorResponse errorResponse;
[DataMember]
public bool PersonResponse
{
get { return personResponse; }
set { personResponse= value; }
}
[DataMember]
public string ErrorResponse
{
get { return errorResponse; }
set { errorResponse= value; }
}
}
public Response(PersonRequest request)
{
return new Response{ PersonResponse = New PersonResponse { Id = 1, Name = "Mark" }, ErrorResponse = new ErrorResponse { ErrorCode = null, ErrorText = null } };
}
但我只需要回傳一種型別的回應,而不是兩者。
我試過了
public PersonResponse(PersonRequest request)
{
throw new WebFaultException<ErrorResponse>(new ErrorResponse { ErrorCode = 103 ErrorText = "Try again later" }, HttpStatusCode.Conflict);
}
但似乎這種方式只回傳例外而不回傳ErrorResponse。
我也嘗試像這樣向回應添加和介面層,然后將該介面作為回應回傳
public interface IResponse {}
[DataContract]
public class PersonResponse : IResponse
{
int id;
string name;
[DataMember]
public int Id
{
get { return id; }
set { id = value; }
}
[DataMember]
public string Name
{
get { return name; }
set { name = value; }
}
}
[DataContract]
public class ErrorResponse : IResponse
{
int errorCode;
string errorText;
[DataMember]
public int? ErrorCode
{
get { return errorCode; }
set { errorCode = value; }
}
[DataMember]
public string ErrorText
{
get { return errorText; }
set { errorText = value; }
}
}
public IResponse(PersonRequest request)
{
return new PersonResponse { Id = 1, Name = "Mark" };
}
但是,當我將此服務添加為對另一個專案 ID 的參考時,不會生成任何回應型別(Iresponse、ErrorResonse 或 PersonResponse),并且在我嘗試呼叫該方法時會引發錯誤(例外訊息https://ibb.co /Zdsbr9p )
uj5u.com熱心網友回復:
I think you can try to use FaultContractAttribute. Fault contracts allow you to specify alternate responses that will be returned in a SOAP fault.
Example interface:
[ServiceContract]
interface IService
{
[OperationContract]
[FaultContract(typeof(ErrorResponse))]
PersonResponse GetResponse();
}
Service:
class Service : IService
{
public PersonResponse GetResponse()
{
if (success)
{
return new PersonResponse();
}
else
{
throw new FaultException<ErrorResponse>(new ErrorResponse()
{
ErrorMessage = "Something Happened"
})
}
}
}
The client can then handle the fault by catching FaultException<ErrorResponse>:
var serviceProxy = new ServiceProxy();
try
{
var dataObj = serviceProxy.GetResponse();
}
catch (FaultException<ErrorResponse> error)
{
ErrorResponse detail = error.Detail;
Console.WriteLine(detail.ErrorMessage);
}
source:How best should a Wcf service return different objects for the same method
resemblance:Return different Object (List or error class) from WCF service
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/447277.html
標籤:wcf
上一篇:輸入裝飾屬性的角度變化檢測
