كيف تجعل سلوك WCF Webhttp يقبل أفعال الرأس؟
-
21-09-2019 - |
سؤال
لدي خدمة WCF مستضافة في خدمة Windows. لقد أضفت إليها webhttpbinding مع سلوك webhttp ، وكلما أرسلت ذلك ، احصل على طلب أحصل على http 200 وهو ما أريده ، المشكلة هي أنني أحصل على http 405 كلما أرسلت طلب رأس.
هل هناك طريقة لجعله يعود HTTP 200 أيضًا للرأس؟ هل هذا ممكن؟
تحرير: هذا هو عقد العملية:
[OperationContract]
[WebGet(UriTemplate = "MyUri")]
Stream MyContract();
المحلول
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet(UriTemplate="/data")]
string GetData();
}
public class Service : IService
{
#region IService Members
public string GetData()
{
return "Hello";
}
#endregion
}
public class Program
{
static void Main(string[] args)
{
WebHttpBinding binding = new WebHttpBinding();
WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:9876/MyService"));
host.AddServiceEndpoint(typeof(IService), binding, "http://localhost:9876/MyService");
host.Open();
Console.Read();
}
}
الرمز أعلاه يعمل بشكل جيد. أحصل على 405 (طريقة غير مسموح بها) بناءً على طلب الرأس. إصدار التجميع الذي أستخدمه هو System.ServicEmodel.web ، الإصدار = 3.5.0.0 ، الثقافة = محايد ، publickeytoken = 31BF3856AD364E35.
في الواقع بقدر ما أعرف أنه لا توجد طريقة مباشرة للأمام للسماح بذلك. ومع ذلك ، يمكنك تجربة شيء مثل الحل أدناه .. ولكن يجب القيام بذلك لكل طريقة تحتاج إلى الحصول عليها ورأسها ، مما يجعله حلًا أنيقًا جدًا ..
[ServiceContract]
public interface IService
{
[OperationContract]
[WebInvoke(Method = "*", UriTemplate = "/data")]
string GetData();
}
خدمة الطبقة العامة: Iservice {#region أعضاء iservice
public string GetData()
{
HttpRequestMessageProperty request =
System.ServiceModel.OperationContext.Current.IncomingMessageProperties["httpRequest"] as HttpRequestMessageProperty;
if (request != null)
{
if (request.Method != "GET" || request.Method != "HEAD")
{
//Return a 405 here.
}
}
return "Hello";
}
#endregion
}
نصائح أخرى
يبدو وكأنه خطأ خطير في الخدمة (أو حتى الإطار). دعم الرأس في HTTP/1.1 ليس اختياريًا بأي حال من الأحوال.