سؤال

لدي خدمة 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 ليس اختياريًا بأي حال من الأحوال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top