我目前正在构建一个通过 DotNetOpenAuth 库进行身份验证的 Web 服务。为此,我在 IIS7 服务器上创建了两个站点,一个与消费者,另一个与提供者和实际的 web 服务(顺便说一下,我目前正在本地调试消费者项目,但最终我会切换到消费者项目在单独的 IIS7 站点上)。
每个项目的实施单独工作就像一个魅力,然而,当把它们捆绑在一起时,我遇到了一个问题。
从消费者调用 web 服务,并返回一个List<TimeTable>
(TimeTable 是我自己编写的类)。然而,每当我测试我的代码时,webservice 工作正常,生成一个包含大约 300 个项目的列表,但是当消费者收到它时,列表突然计数为 0。
我相信这可能是因为 web 服务和消费者是独立的项目。消费者项目不“知道” TimeTable 类(因为它只存在于服务提供者项目中),所以在消费者中我尝试使用 aList<object>
来存储List<TimeTable>
,这显然不起作用。但是我不知道我应该改用什么。
想法?
编辑:根据要求,我添加了来自消费者和提供者的最重要的方法。请注意,其中大多数与 DotNetOpenAuth 示例几乎相同——以这种方式检索字符串或“列表”非常有效。
消费者 SampleWcf.aspx.cs中的方法
protected void retrieveTimeTable_Click(object sender, EventArgs e)
{
try
{
List<object> timeTables = CallService(client => client.retrieveTimeTable("1", "52"));
this.retrieveTimeTableLabel.Text = timeTables.Count.ToString();
}
catch (SecurityAccessDeniedException)
{ this.retrieveTimeTableLabel.Text = "Access denied!"; }}
private T CallService<T>(Func<DataApiClient, T> predicate)
{
DataApiClient client = new DataApiClient();
var serviceEndpoint = new MessageReceivingEndpoint(client.Endpoint.Address.Uri, HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.PostRequest);
var accessToken = Session["WcfAccessToken"] as string;
if (accessToken == null)
{ throw new InvalidOperationException("No access token!"); }
WebConsumer consumer = this.CreateConsumer();
WebRequest httpRequest = consumer.PrepareAuthorizedRequest(serviceEndpoint, accessToken);
HttpRequestMessageProperty httpDetails = new HttpRequestMessageProperty();
httpDetails.Headers[HttpRequestHeader.Authorization] = httpRequest.Headers[HttpRequestHeader.Authorization];
using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) {
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpDetails;
return predicate(client); }}
在 DataApiClient 类中
public List<string> getList()
{ return base.Channel.getList(); }
类 DataApi.cs中提供程序中的方法
public List<TimeTable> retrieveTimeTable(string weekVan, string weekTot)
{
TimeTableWebService ttws = new TimeTableWebService();
List<TimeTable> results = ttws.getTimeTable(weekVan, weekTot);
StringBuilder fbr = new StringBuilder();
fbr.AppendLine("New log created on: " + DateTime.Now.ToString());
fbr.AppendLine("Number of results: " + results.Count);
using (StreamWriter outfile = new StreamWriter(@"D:\oauthSiteTest\log9.txt"))
{ outfile.Write(fbr.ToString()); }
return results; }