使用WCF

时间:2017-07-30 08:17:58

标签: c# wcf azure soap ebay

我正在尝试使用ebay及其sdk接收通知。我已经设法找到一个使用asp.net Web服务的工作示例。但是我希望能够在Azure上托管这个并将其移动到WCF似乎是一个合适的解决方案。我试过这样做,而我最接近的是得到xml serializer错误,如下所示:

  

服务器在处理请求时遇到错误。异常消息是“无法使用根名称'Envelope'和根名称空间'http://schemas.xmlsoap.org/soap/envelope/'反序列化XML主体(对于操作'GetOutBid'和契约('IReceiver','urn:ebay:apis:eBLBaseComponents'))使用XmlSerializer。确保将与XML对应的类型添加到服务的已知类型集合中。'

从我在网上看到的,看起来可能与如何设置datacontract有关 - 我是WCF的新手,所以不确定!

以下是我正在尝试将其放入WCF的Web服务中的工作:

[WebMethod()]
[System.Web.Services.Protocols.SoapHeaderAttribute("RequesterCredentials", Direction = System.Web.Services.Protocols.SoapHeaderDirection.In)]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(Action = "http://developer.ebay.com/notification/OutBid", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
public void OutBid(GetItemResponseType GetItemResponse)
{
    if (CheckSignature(GetItemResponse.Timestamp))
    {
        //Implement your own business logic here
    }
    else
    {
        //Implement your own business logic here
    }
    LogRequest(Server.MapPath("files/OutBid_" + GetItemResponse.Item.ItemID + "_" + GetItemResponse.Item.SellingStatus.BidCount.ToString() + "_" + GetItemResponse.CorrelationID + ".xml"));
}
public class student { public int rollno { get; set; } }
public class school { public student obj { get; set; } }

class Program
{
    static void Main(string[] args)
    {
        school obje = new school(); obje.obj.rollno = 2; Console.WriteLine(obje.obj.rollno);
    }
}

所以如果有人能指出我正确的方向,我会非常感激!!谢谢

1 个答案:

答案 0 :(得分:0)

根据您的代码,我发现服务和客户端之间的协议是SOAP。要支持SOAP,我们需要在WCF中使用basicHttpBinding。 web.config中的protocolMapping配置部分应该是这样的。

<protocolMapping>
  <add binding="basicHttpBinding" scheme="http"/>
</protocolMapping>    

之后,我们可以定义服务联系人和服务来处理请求。

服务联系人可能是这样的。

[ServiceContract]
public interface IService1
{
    [OperationContract(Action= "http://developer.ebay.com/notification/OutBid")]
    string OutBid(school value);
}

服务样本。

public class Service1 : IService1
{
    public string OutBid(school value)
    {
        return string.Format("The rollno is {0}", value.obj.rollno);
    }
}

以下是我的测试结果。

样品申请。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://developer.ebay.com/notification/OutBid</Action>
  </s:Header>
  <s:Body>
    <OutBid xmlns="http://tempuri.org/">
      <value xmlns:d4p1="http://schemas.datacontract.org/2004/07/TestSOAP" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <d4p1:obj>
          <d4p1:rollno>2</d4p1:rollno>
        </d4p1:obj>
      </value>
    </OutBid>
  </s:Body>
</s:Envelope>

示例结果。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <OutBidResponse xmlns="http://tempuri.org/">
      <OutBidResult>The rollno is 2</OutBidResult>
    </OutBidResponse>
  </s:Body>
</s:Envelope>

如果您无法完成工作,请发布您的示例XML请求内容以供进一步讨论。